【发布时间】:2020-10-20 14:12:18
【问题描述】:
想象一下两个小部件:管理标签栏并因此包含多个小部件的 Main - 和 Dashboard。 在主构造函数上,我创建了第一个仪表板实例和其他带有一些虚拟数据的选项卡栏小部件(同时在 initState 中获取它们)。我用 Futurebuilder 构建 这些。数据到达后,我想创建一个新的仪表板实例,但它不会改变。
class _MainState extends State<HomePage> {
var _tabs = <Widget>[];
Future<dynamic> futureData;
_MainState() {
_tabs.add(Dashboard(null));
}
@override
void initState() {
super.initState();
futureData = _getData();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: futureData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data != null) {
tabs[0] = Dashboard(snapshot.data);
} else {
return CircularProgressIndicator();
}
});
}
}
class DashboardScreen extends StatefulWidget {
final data;
DashboardScreen(this.data,
{Key key})
: super(key: key) {
print('Dashboard Constructor: ' + data.toString());
}
@override
_DashboardScreenState createState() => _DashboardScreenState(data);
}
class _DashboardScreenState extends State<DashboardScreen> {
var data;
_DashboardScreenState(this.data);
@override
void initState() {
super.initState();
print('InitState: ' + data.toString());
}
@override
void didUpdateWidget(Widget oldWidget) {
super.didUpdateWidget(oldWidget);
print('didUpdateWidget');
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
print('didChangeDependencies' + data.toString());
}
@override
Widget build(BuildContext context) {
return Text(data.toString());
}
}
当我在几个可用的方法上打印时,很明显 DasboardScreenState 没有重新创建。数据到达时仅再次调用 DashboardScreen 构造函数,而不是它的状态...
flutter: MainConstructor: null
flutter:仪表板构造函数:null
颤动:InitState:空
颤振:didChangeDependencies:空
flutter: Dashboard Constructor: MachineStatus.Manual
如何强制国家重建?我尝试将 key 参数与 UniqueKey() 一起使用,但没有奏效。尽管我不知道如何在我的用例中使用它,但继承的小部件似乎也不是解决方案,因为子项仅在 ..ScreenState 中可用,但在更新后的数据中不可用..
我可以想象通过使用 Stream 来通知 dashboardScreenState:听消息,然后调用 setState() - 我认为,但这只是一种解决方法。
谁能帮帮我:)?
【问题讨论】:
标签: flutter dart state rebuild statefulwidget