Отправьте значение в приложение из разных классов, но кнопку нужно нажать (нажать) два раза — Трепещите / Стреляйте

#android #ios #flutter #dart

Вопрос:

При отправке значения из текстового поля из разных классов в панель приложений, но что происходит, кнопку необходимо нажать (нажать) дважды, после чего значение может быть отправлено только в объект назначения (панель приложений). Надеюсь, кто-нибудь сможет просмотреть и дать мне совет, я ценю ваши советы.

Результаты клика, как показано ниже:

  1. результат 1-го клика показывает Пустоту и отсутствие значения.
  2. результат 2-го щелчка-это желаемое и ожидаемое значение, которое будет отправлено в объект назначения.

Скриншоты, как показано ниже:

https://i.stack.imgur.com/2uUN3.png

https://i.stack.imgur.com/EiNvC.png

https://i.stack.imgur.com/soc7z.png

главная.дротик

 import 'package:flutter/material.dart'; import 'custombutton.dart';  void main() {  runApp(const MyApp()); }  class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);   @override  Widget build(BuildContext context) {  return MaterialApp(  theme: ThemeData(  primarySwatch: Colors.blue,  ),  home: const MyHomePage(title: 'App Value is '),  );  } }    class MyHomePage extends StatefulWidget {  const MyHomePage({Key? key, required this.title}) : super(key: key);   final String title;   @override  Statelt;MyHomePagegt; createState() =gt; _MyHomePageState(); }  class _MyHomePageState extends Statelt;MyHomePagegt; {   final _textfield = TextEditingController();  String AppBarVar = 'UNKNOWN';   _callback(varAppBar){  setState(() {  AppBarVar = varAppBar;  });  }   @override  void dispose() {   _textfield.dispose();  super.dispose();  }   @override  Widget build(BuildContext context) {   return Scaffold(  appBar: AppBar(   title: Text(widget.title   AppBarVar),  ),  body: Center(   child: Column(   mainAxisAlignment: MainAxisAlignment.center,  children: lt;Widgetgt;[  const Text(  'Passing Value from TextField to App Bar',  ),   TextField(  controller: _textfield,  keyboardType: TextInputType.text,  decoration: const InputDecoration(  hintText: 'Enter Values pass to Appbar'  ),  ),   CustomButton(AppBarVar: _textfield.text, callback: _callback)  ],  ),  ),   );  } }  

Пользовательская кнопка.дротик

 import 'package:flutter/material.dart';  class CustomButton extends StatefulWidget {  final String AppBarVar;  final Function callback;   const CustomButton({Key? key, required this.AppBarVar, required this.callback}) : super(key: key);   @override  Statelt;CustomButtongt; createState() =gt; _CustomButtonState(); }  class _CustomButtonState extends Statelt;CustomButtongt; {  @override  Widget build(BuildContext context) {  return ElevatedButton(  onPressed: (){  setState(() {  widget.callback(widget.AppBarVar);  });  },  child: Text('Send to AppBar'),  );  } }  

Ответ №1:

Вам необходимо внести следующие изменения в свой код

передайте обратный вызов в onPressed и вызовите setState на том же экране, что и ниже

 import 'package:custom/second.dart'; import 'package:flutter/material.dart';  void main() {  runApp(const MyApp()); }  class MyApp extends StatelessWidget {  const MyApp({Key? key}) : super(key: key);   @override  Widget build(BuildContext context) {  return MaterialApp(  theme: ThemeData(  primarySwatch: Colors.blue,  ),  home: const MyHomePage(title: 'App Value is '),  );  } }    class MyHomePage extends StatefulWidget {  const MyHomePage({Key? key, required this.title}) : super(key: key);   final String title;   @override  Statelt;MyHomePagegt; createState() =gt; _MyHomePageState(); }  class _MyHomePageState extends Statelt;MyHomePagegt; {   final _textfield = TextEditingController();  String AppBarVar = 'UNKNOWN';   _callback(varAppBar){  setState(() {  AppBarVar = varAppBar;  });  }   @override  void dispose() {   _textfield.dispose();  super.dispose();  }   @override  Widget build(BuildContext context) {   return Scaffold(  appBar: AppBar(   title: Text(widget.title   AppBarVar),  ),  body: Center(   child: Column(   mainAxisAlignment: MainAxisAlignment.center,  children: lt;Widgetgt;[  const Text(  'Passing Value from TextField to App Bar',  ),   TextField(  controller: _textfield,  keyboardType: TextInputType.text,  decoration: const InputDecoration(  hintText: 'Enter Values pass to Appbar'  ),  ),   CustomButton(AppBarVar: _textfield.text, callback: (){  setState(() {  AppBarVar = _textfield.text;  });  })  ],  ),  ),   );  } }  

и в другой файл

 import 'package:flutter/material.dart';  class CustomButton extends StatefulWidget {  final String AppBarVar;  final Function() callback;   const CustomButton({Key? key, required this.AppBarVar, required this.callback}) : super(key: key);   @override  Statelt;CustomButtongt; createState() =gt; _CustomButtonState(); }  class _CustomButtonState extends Statelt;CustomButtongt; {  @override  Widget build(BuildContext context) {  return ElevatedButton(  onPressed: widget.callback,  child: Text('Send to AppBar'),  );  } }  

Обновление, используйте это в качестве обратного вызова

 _callback(){  setState(() {  AppBarVar = _textfield.text;  });  }  

и передай это сюда

 CustomButton(AppBarVar: _textfield.text, callback: _callback)  

Комментарии:

1. _callback() в main.dart показывает неиспользуемый элемент.

2. у вас есть выбор либо удалить его, либо изменить с помощью функции, соответствующей функции, вызываемой в CustomButton

3. Понятия не имею, как ввести в действие ваше предложение, если я не хочу его удалять.

4. Только что выяснил, что в вашем методе вообще нет функции «обратного вызова».

5. Пожалуйста, проверьте обновленный ответ