想象两个小部件:Main,它管理一个选项卡,因此包含多个小部件-和Dashboard。 在Main Constructor上,我创建了Dashboard的第一个实例以及其他带有一些伪数据的Tabbar Widget(与此同时,它们在initState中被获取)。我用Futurebuilder 构建这些。数据到达后,我想创建一个新的Dashboard实例,但是它不会改变。
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:空
flutter:仪表板构造函数:null
颤振:InitState:空
颤振:didChangeDependencies:空
颤振:仪表板构造函数:MachineStatus.Manual <-这里数据到达了futureBuilder
我如何强迫国家重建?我试图将key参数与UniqueKey()一起使用,但这没有用。尽管我不知道如何在用例中使用它,但是继承的小部件似乎也不是解决方案,因为该子项仅在..ScreenState中可用,而在更新后的数据中不可用。
我可以想象通过使用Stream来通知dashboardScreenState:侦听消息,然后调用setState()-我认为,但这只是一个解决方法。
有人可以帮我吗:)?
答案 0 :(得分:0)
我知道以前if语句有问题,请尝试:
return FutureBuilder(
future: futureData,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) { //use hasData
DataType data = snapshot.data; //Declare Values first
tabs[0] = Dashboard(data);
} else {
return CircularProgressIndicator();
}
});