Представьте себе два виджета: основной, который управляет панелью вкладок и, следовательно, содержит несколько виджетов, и панель инструментов. В главном конструкторе я создаю первый экземпляр панели инструментов и другие виджеты панели вкладок с некоторыми фиктивными данными (тем временем они загружаются в 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, но не его состояние ...
флаттер: MainConstructor: null
flutter: Конструктор приборной панели: null
флаттер: InitState: null
flutter: didChangeDependencies: null
flutter: Dashboard Constructor: MachineStatus.Manual ‹- Здесь данные поступили в futureBuilder
Как я могу заставить государство воссоздать? Я пытался использовать ключевой параметр с UniqueKey (), но это не сработало. Также унаследованный виджет, похоже, тоже не является решением, несмотря на то, что я не знаю, как использовать его в моем случае использования, потому что дочерний элемент доступен только в ..ScreenState, но не в обновленных данных ..
Я мог бы представить, как информировать dashboardScreenState с помощью Stream: прослушивать сообщения, а затем вызывать setState () - я думаю, но это только обходной путь.
Кто-нибудь может мне помочь :)?