android - Flutter - 如何在其他小部件中访问 TextEditingController?
问题描述
我的 main.dart 中有一个TextField,控制器名为textcontroller。在其他小部件(button.dart)中,我有一个按钮。如果我按下该按钮,它应该将我的 main.dart 中的Text小部件的文本设置为TextField的文本。只需执行与 main.dart 中的第一个按钮相同的操作即可。如何从其他小部件(文件)访问此 TextEditingController?
这是我的应用程序的视频,以便更好地理解。 https://streamable.com/xi0dn1
这是我的 main.dart 完整代码
import 'button.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
MyHomePageState createState() => MyHomePageState();
}
class MyHomePageState extends State<MyHomePage> {
String var1 = "text1";
TextEditingController textController = TextEditingController();
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("My app"),
),
body: Center(
child: Column(
children: <Widget>[
TextField(
controller: textController,
),
RaisedButton(
child: Text("button in the same widget"),
onPressed: () {
setState(() {
var1 = textController.text;
});
},
),
Text(var1),
Button2(),
],
),
),
);
}
}
这是我的 button.dart 代码
import 'main.dart';
class Button2 extends StatefulWidget {
@override
_Button2State createState() => _Button2State();
}
class _Button2State extends State<Button2> {
String var2 = "text2";
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: <Widget>[
RaisedButton(
child: Text("button in second widget"),
onPressed: () {
setState(() {
var2 = MyHomePageState().textController.text.toString();
});
},
),
Text(var2),
],
),
);
}
}
解决方案
将函数与小部件分离并传递函数。
在我的主页状态中:
// Extract the function
void onPressedFunction() {
setState(() {
var1 = textController.text;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
// ...
child: Column(
children: <Widget>[
RaisedButton(
// ...
onPressed: onPressedFunction, // function is extracted
),
Text(var1),
Button2(onPressedFunction), // pass the function
],
),
);
}
在按钮 2 中:
class Button2 extends StatefulWidget {
final Function onPressedFunction;
Button2(this.onPressedFunction); // accept the function
@override
_Button2State createState() => _Button2State();
}
class _Button2State extends State<Button2> {
@override
Widget build(BuildContext context) {
return Center(
child: Column(
children: <Widget>[
RaisedButton(
child: Text("button in second widget"),
onPressed: widget.onPressedFunction, // use the same function
),
Text(var2),
],
),
);
}
}
这样,您的 Button2 将执行与按下第一个按钮相同的操作。
推荐阅读
- facebook - “请更新您的隐私政策以符合我们的平台条款”我有隐私政策链接
- android - TextView 电子邮件后缀“.com”换行(无需 breakStrategy 即可修复)
- python - Pandas 数据框合并为匹配列提供了奇怪的输出
- r - 在同一张纸上安排 ggplot 时出现错误,包括 grobs
- angular - 错误 ng0100 expressionchangedafterithasbeencheckederror in angular:表达式在检查后已更改
- r - 与 R 的 ODBC 连接返回“用户登录失败”
- performance - 加速 Tcl 评估
- react-native - 阿波罗客户端缓存持久性加密
- python - Tensorflow 2.2.0 Keras Subclass Model 可以训练和预测,但是保存时抛出异常:维度大小必须能整除 X
- java - 春季启动版本更新到 2.4.3 后 Quartz 调度程序停止工作