Flutter TabBarView продолжает звонить строителям

60
4

У меня есть виджет StatelessWidget для моего tabBar, который содержит 2 statefulWidgets. Дело в том, что при нажатии на диспетчер для просмотра всех моих вкладок (по умолчанию на первой вкладке по умолчанию) вызывается редактор виджета tab1.

Я уже пробовал эти два подхода, но они не работали. qaru.site/questions/7419429/...

qaru.site/questions/7419436/...

Это действительно раздражает, потому что в некоторых виджетах мне нужно сделать некоторые HTTP-запросы, и они также продолжают вызываться.

 body:  TabBarView(
children: <Widget>[
Tab1Page(),
Tab2Page(),

здесь страница tab1, которая является stateFulWidget

Widget build(BuildContext context) {
// TODO: implement build
print("tab1: Builder");
return ScopedModelDescendant<MainModel>(
builder: (BuildContext context, Widget child, MainModel model) {
List<SolicitudDto> listadoSolicitudesAprobadas =
model.obtenerSolicitudesPendientes();

return Scaffold(
body: ListView(
children: <Widget>[
_buildCards(context, listadoSolicitudesAprobadas)
],
),
);
},
);

}

Это захват печати моего отладчика

enter image description here

Заранее спасибо.

спросил(а) 2018-08-16T19:08:00+03:00 1 год, 6 месяцев назад
1
Решение
60

Если вы хотите сохранить состояние своего экрана в своем TabBarView, вы можете использовать класс mixin под названием AutomaticKeepAliveClientMixin в своем классе State.

После этого вы должны переопределить метод wantKeepAlive и вернуть true.

Я написал сообщение об этом здесь: https://medium.com/@diegoveloper/flutter-persistent-tab-bars-a26220d322bc

ОБНОВИТЬ

Вы можете попробовать таким образом избежать данных запроса каждый раз, когда вы переключаете вкладки.

  //global variable at your state class

List<SolicitudDto> listadoSolicitudesAprobadas;

Widget build(BuildContext context) {
// TODO: implement build
print("tab1: Builder");
return ScopedModelDescendant<MainModel>(
builder: (BuildContext context, Widget child, MainModel model) {
if (listadoSolicitudesAprobadas == null){
listadoSolicitudesAprobadas = model.obtenerSolicitudesPendientes();
}

return Scaffold(
body: ListView(
children: <Widget>[
_buildCards(context, listadoSolicitudesAprobadas)
],
),
);
},
);

ответил(а) 2018-08-16T19:31:00+03:00 1 год, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема