Представление списка флаттеров через значение будущего поставщика - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь вызвать вывод поставщика будущего типа Future> в построитель представления списка. Я думаю, что я очень близок, так как я могу визуализировать само окончательное представление списка, однако до этого появляется ошибка, и она быстро заменяется представлением списка после завершения Future. Я полагаю, что там может быть что-то не так с моей реализацией.

Вот что я получил до сих пор (это производные от моего реального кода, там слишком много всего, что не нужно, я пытался упростить это):

class TempProvider extends ChangeNotifier(){
    List<Widget> _list = <Widget>[];
    List<Widget get list => _list;

    Future<List<Widget>> getList() async{
        List _result = await db....
        _result.forEach((_item){
            addToList(_item);
        });
    }

    addToList(Widget widget){
        _list.add(widget);
        notifyListeners();
    }
}

class Parent extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
        return FutureProvider(
        create: (context) => TempProvider().getList(),
        child: Child(),
        );
    }   
}

class Child extends StatelessWidget{
    @override
    Widget build(BuildContext context) {
    var futureProvider = Provider.of<List<Widget>>(context);

        return FutureBuilder(
            initialData: <Widget>[],
            future: TempProvider().getList(),
            builder: (BuildContext context, AsyncSnapshot snapshot) {
                if (snapshot.connectionState == ConnectionState.none &&
                    snapshot.hasData == true) {
                    return ListView.builder(
                        itemCount: futureProvider.length,
                        itemBuilder: (BuildContext context, int index) {
                            return futureProvider[index];
                        },
                    );
                } else {
                    return Text('ALAWS');
                }
          },
        );
    }   
}

Таким образом, выводом моего Future будет список виджетов, который будет заполнять представление списка, которое я пытаюсь создать. Хотя я могу сделать представление списка в конце, ошибка ниже появляется между:

The getter 'length' was called on null.
Receiver: null
Tried calling: length
The relevant error-causing widget was
FutureBuilder<List<Widget>> 

Надеясь, что кто-то может помочь с этим или, по крайней мере, привести лучший пример.

Большое вам спасибо!

Ответы [ 2 ]

2 голосов
/ 17 февраля 2020

Не уверен, но это происходит из-за того, что ваш виджет может собираться дважды, и на первом месте futureProvider имеет значение null, а во второй раз он имеет некоторое значение.

Обходной путь:

Замените это:

futureProvider.length

этим:

futureProvider?.length ?? 0

Что делает вышеуказанный код?

  1. futureProvider?.length: если futureProvider имеет значение null don не получить доступ к его длине.
  2. Теперь возвращаемое значение будет нулевым.
  3. ?? 0: если возвращаемое значение равно нулю, вернуть 0;

Вам нужно продумать следующие вещи и отредактировать свой код.

  1. На первом месте futureProvider не должно быть нулевым.
  2. Почему вы не используете snaphot.data, когда вы используя FutureBuilder.
0 голосов
/ 17 февраля 2020

Итак, я провел свое исследование и нашел нижеприведенную статью, в которой показана определенная реализация, основанная на том, что мне нужно:

Примеры провайдеров флаттера - Codetober Кредиты Дугласу Тоберу для статьи , Еще раз спасибо Kalpe sh за быструю помощь!

...