Свойство длины контроллера не соответствует количеству вкладок, присутствующих в свойстве вкладок TabBar - PullRequest
0 голосов
/ 16 апреля 2020

Я реализую TabBar, но получаю ошибку, как указано выше. Я знаю причину, по которой это происходит, но не могу понять, как это исправить.

У меня есть функция asyn c, предназначенная для извлечения данных из Firebase, которая заполняет список. Функция описана ниже. Данные, извлекаемые этой функцией, используются для передачи длины в TabController.

Функция для вызова данных из Firebase:

Future functionName async {

await function actions...
  List example = ['item1', 'item2', 'item3', 'item4'];
} 

Эта функция используется в Future Builder , который возвращает виджет для отображения, как только выполнение функции завершено.

Будущее Future Builder инициализируется в initState () класса. Состояние init () выглядит следующим образом:

  @override
  void initState() {
    super.initState();

    _future = functionName();

    tabController = TabController(length: example.length, vsync: this, initialIndex: 0);

    tabController.addListener(_setActiveTabIndex);
 }

Теперь я получаю сообщение об ошибке, как указано выше. Что очевидно, почему! Поскольку функция является асинхронной c функцией и встроена в Future Builder, изначально список «example» пуст. И TabController получает длину 0. Но когда этот список заполняется, длина увеличивается, но длина TabController не меняется.

Я пытался использовать:

    @override
    void initState() {
      super.initState();

    _future = functionName();

    setState(() {
       tabController = TabController(length : example. length, vsync : this, initialIndex : 0)
  } 
) 

Но это тоже не работает. Досадно знать проблему, но не могу ее исправить. Любая помощь в этом будет высоко оценена.

1 Ответ

0 голосов
/ 16 апреля 2020

Вы уже знаете причину проблемы.

Идея дырки в некотором роде задом наперед.

Вы пытаетесь построить TabBar, прежде чем узнаете, сколько вкладок вам нужно .


Вы можете

  • Выполнить FutureBuilder и затем построить TabBar с полученными данными.

Или вы можете

  • Получите данные до того, как вы go выйдете на этот экран, поэтому данные уже есть.

Надеюсь, это поставит вас на правильный путь

...