Android 颤振-如何在其他小部件中访问TextEditingController?
我在main.dart中有一个名为textcontroller的控制器。 在其他widget button.dart中,我有一个按钮。如果我按下该按钮,它会将main.dart中文本小部件的文本设置为文本字段的文本。只需按照main.dart中的第一个按钮进行操作。如何从其他小部件文件访问此TextEditingController 下面是我的应用程序的视频,以便更好地理解。 这是我main.dart的完整代码Android 颤振-如何在其他小部件中访问TextEditingController?,android,flutter,dart,Android,Flutter,Dart,我在main.dart中有一个名为textcontroller的控制器。 在其他widget button.dart中,我有一个按钮。如果我按下该按钮,它会将main.dart中文本小部件的文本设置为文本字段的文本。只需按照main.dart中的第一个按钮进行操作。如何从其他小部件文件访问此TextEditingController 下面是我的应用程序的视频,以便更好地理解。 这是我main.dart的完整代码 import 'button.dart'; void main() { ru
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),
],
),
);
}
}
您可以为MyHomePage使用MyHomePageState类型的GlobalKey,并将其传递给button2的构造函数。使用GlobalKey,您可以调用对应小部件状态的方法
main.dart:
按钮2.省道:
您可以为MyHomePage使用MyHomePageState类型的GlobalKey,并将其传递给button2的构造函数。使用GlobalKey,您可以调用对应小部件状态的方法
main.dart:
按钮2.省道:
将函数与小部件分离并传递函数 在MyHomePageState中:
// 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),
],
),
);
}
}
这样,按钮2将执行与按下的第一个按钮相同的操作。将功能与小部件分离并传递该功能 在MyHomePageState中:
// 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),
],
),
);
}
}
这样,按钮2将执行与按下的第一个按钮相同的操作。谢谢您的回答,但我需要访问控制器,而不是执行与第一个按钮相同的操作。如果我键入我的onPressed:setState{var2=MyHomePageState.textController.text;};在按钮2中,它显示我在textController中的文本为空,但有一个文本。。。我只需要知道我是否需要将侦听器添加到我的textController或其他东西来显示文本…你正在创建一个新的MyHomePageState对象。将文本编辑控制器设置为静态并使用MyHomePageState.textController.text,或者将控制器本身传递给Button2。第二种方法更可取。@MatějMichálekt感谢您的回答,但我需要访问控制器,而不是像第一个按钮那样操作。如果我键入我的onPressed:setState{var2=MyHomePageState.textController.text;};在按钮2中,它显示我在textController中的文本为空,但有一个文本。。。我只需要知道我是否需要将侦听器添加到我的textController或其他东西来显示文本…你正在创建一个新的MyHomePageState对象。将文本编辑控制器设置为静态并使用MyHomePageState.textController.text,或者将控制器本身传递给Button2。在我看来,第二种方法更可取。@MatějMichálekt感谢您的回答,但如果我将按钮2设置为ON,则按下设置状态{var2=MyHomePageState.textController.text;};它只是表明textController的文本是空的。我应该添加一些侦听器还是更新textController以显示文本?MyHomePageState.textController.text:这样,您正在创建MyHomePageState类的一个新实例,这不是您想要的。这就是为什么我建议你改用GlobalKey。通过使用GlobalKey,您将获得对MyHomePageState实例的访问权,而您还没有新实例@MatějMichálekBy通过使用GlobalKey,您还可以访问textController或MyHomePageState中的其他每个方法/变量@MatějMichálekt感谢您的回答,但如果我将按钮2设置为ON,按下设置状态{var2=MyHomePageState.textController.text;};它只是表明textController的文本是空的。我应该添加一些侦听器还是更新textController以显示文本?MyHomePageState.textController.text:这样,您正在创建MyHomePageState类的一个新实例,这不是您想要的。这就是为什么我建议你改用GlobalKey。通过使用GlobalKey,您将获得对MyHomePageState实例的访问权,而您还没有新实例@MatějMichálekBy通过使用GlobalKey,您还可以访问textController或MyHomePageState中的其他每个方法/变量@马季米切莱克