#android #ios #flutter #dart
Вопрос:
При отправке значения из текстового поля из разных классов в панель приложений, но что происходит, кнопку необходимо нажать (нажать) дважды, после чего значение может быть отправлено только в объект назначения (панель приложений). Надеюсь, кто-нибудь сможет просмотреть и дать мне совет, я ценю ваши советы.
Результаты клика, как показано ниже:
- результат 1-го клика показывает Пустоту и отсутствие значения.
- результат 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. Пожалуйста, проверьте обновленный ответ