我刚开始颤抖,这是一个基本问题,但我无法解决。 我创建了一个有状态小部件,我需要在单击按钮时调用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++;
}
}
}
答案 0 :(得分:2)
我需要在点击按钮时调用setState()方法
您可能有一些选项(或替代方案)来实现最终结果(所有这些都有不同的权衡):
count
)提升为按钮和显示小组件上方的Inherited Widget。这可能是最简单或最合适的。dispatch
一个动作,通过StoreConnector
影响显示小部件并重建)。这可以被视为提升“另一种方式”的另一种方式。州。但是,这需要一个全新的依赖关系和大量的开销给出你的简单示例,但我想指出它。我可能还有其他解决方案没有想到;但请记住,反应式UI的目标是keep state simple。
因此,如果您有多个关注某个状态的叶子小部件(想知道它,想要更改它),则可能意味着它属于更高级别的组件(例如,应用程序级别的状态,或者也许是其他一些共同的祖先 - 但两者都可以使用Inherited Widget来防止四处传递这个状态。
答案 1 :(得分:0)
您应该在table_log
中使用Scaffold
,而不要在State
中使用。
这是有效的解决方案。
StatelessWidget