android - 从不同的类向应用程序发送值但需要单击(点击)两次按钮 - Flutter / Dart
问题描述
虽然将来自不同类的文本字段的值发送到 App Bar,但是需要单击(点击)两次按钮会发生什么,然后该值只能发送到目标对象(App Bar)。希望任何人都可以评论并给我建议,感谢您的建议。
点击结果如下:
- 第一次点击的结果显示为空且无值。
- 第二次点击的结果是要发送到目标对象的想要的和期望的值。
截图如下:
https://i.stack.imgur.com/2uUN3.png
https://i.stack.imgur.com/EiNvC.png
https://i.stack.imgur.com/soc7z.png
主要.dart
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
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
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: <Widget>[
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)
],
),
),
);
}
}
自定义按钮.dart
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
State<CustomButton> createState() => _CustomButtonState();
}
class _CustomButtonState extends State<CustomButton> {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: (){
setState(() {
widget.callback(widget.AppBarVar);
});
},
child: Text('Send to AppBar'),
);
}
}
解决方案
您需要对代码进行以下更改
将回调传递给 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
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
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: <Widget>[
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
State<CustomButton> createState() => _CustomButtonState();
}
class _CustomButtonState extends State<CustomButton> {
@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)
推荐阅读
- python - google vision api可以用来实现光学标记识别吗?
- powershell - Powershell 帮助。无法弄清楚出了什么问题
- powermockito - 如何为 google spanner 语句和 Statement Builder 创建模拟测试
- ansible - 使用 Ansible 复制特定文件
- linux - 如何处理 docker overlay/diff 目录中巨大的 .m2 目录?
- javascript - 如何调用 URL,将它返回的 JSON 传递给函数并循环遍历结果以记录名称
- c# - 命名空间“Quartz”中不存在类型或命名空间名称“Collection”
- r - 我如何找到连续的值
- firebase - 从 Firebase 控制台临时禁用新注册
- .net - 有没有像先上卡夫卡经纪人然后上消费者的模式?或者我们可以动态提升任何东西