Как использовать FutureBuilder между двумя виджетами с отслеживанием состояния, когда дочерний элемент ожидает завершения установленного состояния родителя?

У меня есть виджет, который использует TabBar. Родительский виджет выполняет HTTP-вызов, который необходимо завершить, прежде чем можно будет нарисовать виджеты TabBar (они используют данные). Как заставить виджеты TabBarView ждать завершения родительского HTTP-вызова и установить переменную состояния, которая затем используется в виджетах TabBarView. Похоже, решение состоит в том, чтобы использовать FutureBuilder для всех виджетов TabBar, но как эти виджеты узнают, что нужно ждать завершения родительского элемента? Эти виджеты ожидают данных от родителя.

Родительский виджет - выполните http-вызов, установите переменную состояния x виджетов TabBarView, дождитесь x. Выдается ошибка, потому что TB1 вызывается до установки x, если я не добавлю какие-то фиктивные данные.

Родительский виджет

  void initState() {
    x = await _getdata();
    setState(() => this.x = x);

  }

...

        TabBarView(
            controller: _tabController,
            children: [
              new TB1(x),
              new TB2(x),
              new TB3(x),
            ]
        )

person user1961    schedule 16.07.2019    source источник


Ответы (1)


Вы можете условно построить свой виджет

DataType x = null;

void initState() {
    _getdata().then((_x) {
        if (mounted){ // Just to be sure is safe to call setState, since _getdata is asynchronous
            setState(() => x = _x);
        }
    });    
}

Widget build(BuildContext context){
    // Loading
    if (x == null){
       return CircularProgressIndicator();
    }else{
        return TabBarView(...);
    }
}
person Martyns    schedule 16.07.2019
comment
@ user1961 Приятно слышать! - person Martyns; 16.07.2019