Я создаю приложение Flutter с блоком навигации, используя класс Drawer
библиотеки материалов.Widget
, содержащий Drawer
, представляет собой StatefulWidget
, а содержимое Scaffold
отображается в соответствии с выбранным элементом на панели навигации.Контент имеет значение WidgetOne
или WidgetTwo
, оба поддерживают свое собственное состояние как StatefulWidget
s.См. Пример кода ниже.
В тот момент, когда я переключаюсь с одного виджета на другой и обратно, все состояние ранее отображенного виджета перезагружается.Это не идеально, так как оба виджета имеют сетевые вызовы от API, и их необходимо соответствующим образом перерисовать.
То, что я пробовал до сих пор
Код
class DrawerWidget extends StatefulWidget {
@override
State<StatefulWidget> createState() => _DrawerState();
}
class _DrawerState extends State<DrawerWidget> {
Widget _activeWidget;
@override
void initState() {
_activeWidget = FirstWidget();
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Drawer demo")),
drawer: Drawer(
child: ListView(
padding: EdgeInsets.zero,
children: <Widget>[
ListTile(
title: Text("First Widget"),
onTap: () {
setState(() {
_activeWidget = FirstWidget();
});
},
),
ListTile(
title: Text("Second Widget"),
onTap: () {
setState(() {
_activeWidget = SecondWidget();
});
},
),
],
),
),
body: _activeWidget);
}
}
class FirstWidget extends StatefulWidget {
// [..]
}
class SecondWidget extends StatefulWidget {
// [..]
}
Желаемый результат
WidgetOne
и WidgetTwo
загружаются только при начальной загрузке (после выбораих в Drawer
).Переключение на другой виджет и обратно не должно перезагружать виджет, если он уже был загружен ранее.Подвиджеты не должны загружать все напрямую, только при их первоначальном нажатии.
Фактический результат
Оба FirstWidget
и SecondWidget
перезагружаются и перерисовываются каждый раз, когда выбираются в Drawer
.