![](/img/trans.png)
[英]how to Call method in one stateful widget from another stateful widget
[英]Call method of a widget from another widget
我刚刚开始颤抖,这是一个基本问题,但我无法解决。 我创建了一个有状态小部件,我需要在单击按钮时调用setState()方法。 该按钮不是此有状态小部件的一部分。 该按钮位于应用程序的页脚中。
完整的应用代码:
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
build(BuildContext context) {
return new MaterialApp(
title: "My app title",
home: new Scaffold(
appBar: new AppBar(
title: new Text("My App"),
backgroundColor: Colors.amber,
),
body: new Container(
child: new Center(
child: new MyStateFullWidget(),
),
),
persistentFooterButtons: <Widget>[
new FlatButton(
onPressed: () {
// I need to call the update() of MyStateFullWidget/MyStateFullWidgetState class
},
child: new Text("Click Here"),
color: Colors.amber,
textColor: Colors.white,
),
],
));
}
}
class MyStateFullWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return new MyStateFullWidgetState();
}
}
class MyStateFullWidgetState extends State<MyStateFullWidget> {
int count = 0;
@override
Widget build(BuildContext context) {
return new Text("Count: $count");
}
update() {
setState() {
count++;
}
}
}
我需要在单击按钮时调用setState()方法
您可能有一些选项(或替代方案)来实现最终结果(所有这些都有不同的权衡):
count
)提升为Button和Display Widget上方的Inherited Widget。 这可能是最简单或最合适的。 dispatch
动作,通过StoreConnector
影响显示小部件并重建)。 这可以被视为“提升”状态的另一种方式。 但是,这需要一个全新的依赖项和大量的开销给出你的简单示例,但我想指出它。 可能还有其他解决方案,我没有想到; 但请记住,反应式UI的目标是保持状态简单 。
因此,如果你有多个关注状态的叶子小部件(想知道它,想要改变它),这可能意味着它属于更高级别的组件(例如,应用程序级别的状态,或者可能是某些其他常见的祖先 - 但两者都可以使用Inherited Widget来阻止所有状态的传递
您应该在State
中使用Scaffold
,而不是在StatelessWidget
中使用。 这是工作解决方案。
class MyApp extends StatelessWidget {
@override
build(BuildContext context) {
return MaterialApp(
title: "My app title",
home: MyStateFullWidget());
}
}
class MyStateFullWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return MyStateFullWidgetState();
}
}
class MyStateFullWidgetState extends State<MyStateFullWidget> {
int count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("My App"),
backgroundColor: Colors.amber,
),
body: Container(
child: Center(
child:Text("Count: $count"),
),
),
persistentFooterButtons: <Widget>[
FlatButton(
onPressed: update,
child: Text("Click Here"),
color: Colors.amber,
textColor: Colors.white,
),
],
);
}
void update() {
setState(() {
count++;
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.