作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试从 Flutter 中的不同小部件更改状态。例如,在以下示例中,我在几秒钟后设置状态。
下面是代码:
class _MyAppState extends State<MyApp> {
int number = 1;
@override
void initState() {
super.initState();
new Future.delayed(new Duration(seconds: 5)).then((_) {
this.setState(() => number = 2);
print("Changed");
});
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new FlatButton(
color: Colors.blue,
child: new Text("Next Page"),
onPressed: () {
Navigator.of(context).push(new MaterialPageRoute(
builder: (BuildContext context) => new StatefulBuilder(builder: (BuildContext context, setState) =>new MySecondPage(number))
));
},
),
),
);
}
}
我尝试使用 InheritedWidget
,但除非我将它包裹在我的顶级小部件周围,否则这将不起作用,这对于我正在尝试做的事情是不可行的(上面的代码是简化我想要实现的目标)。
关于在 Flutter 中实现这一目标的最佳方式有什么想法吗?
最佳答案
尽可能避免这种情况。它使这些小部件相互依赖,并且从长远来看会使事情变得更难维护。
您可以做的是让两个小部件共享一个公共(public) Listenable
或类似的东西,例如 Stream
.然后小部件通过提交事件相互交互。
为了方便编写,还可以将Listenable
/Stream
分别与ValueListenableBuilder
结合起来和 StreamBuilder
两者都为你做监听/更新部分。
Listenable
的简单示例。
class MyHomePage extends StatelessWidget {
final number = new ValueNotifier(0);
@override
Widget build(BuildContext context) {
return Scaffold(
body: ValueListenableBuilder<int>(
valueListenable: number,
builder: (context, value, child) {
return Center(
child: RaisedButton(
onPressed: () {
number.value++;
},
child: MyWidget(number),
),
);
},
),
);
}
}
class MyWidget extends StatelessWidget {
final ValueListenable<int> number;
MyWidget(this.number);
@override
Widget build(BuildContext context) {
return new Text(number.value.toString());
}
}
请注意,我们如何在执行 number.value++
时自动更新 UI,而无需调用 setState
。
关于dart - 如何从另一个小部件设置状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50430273/
我是一名优秀的程序员,十分优秀!