Как создать и обновить значение виджетов Dynami c через Flutter Provider - PullRequest
0 голосов
/ 17 февраля 2020

Итак, я реализую что-то вроде следующего:

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

    Future<List<Widget>> getList() async{
        addToList(Text('$count'));

        List _result = await db....
        _result.forEach((_item){
            addToList(Button(
                onTap: () => increment();
                child: Text('Press'),
            ));
        });
    }

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

    increment(){
        _count += 1;
        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 Container(
        child: futureProvider == null 
            ? Text('Loading...'
            : ListView.builder(
                itemCount: futureProvider.length,
                itemBuilder: (BuildContext context, int index){
                    return futureProvider[index];
                }
            ),
        ));
    }   
}

По сути, это означает, что список виджетов из будущего - это содержимое ListView Builder, которое у меня есть, поскольку его объекты генерируются из запрос к базе данных. Эти виджеты представляют собой кнопки, которые при нажатии должны обновлять значение «Количество» и обновлять виджет текста, отображающий последнее значение «Количество».

Я смог протестировать кнопки, и они, кажется, работают и увеличивают значение. _count значение через бэкэнд, однако отображаемое «Количество» в текстовом виджете не обновляется, даже если обновляются значения провайдера.

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

Я все еще знакомлюсь с этим пакетом и дротик / флаттер в целом, надеясь, что вы поделитесь со мной своим опытом в этом. Заранее большое спасибо.

1 Ответ

0 голосов
/ 18 февраля 2020

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

Вы просто должны были поставить прослушивание значение для потребительского виджета, обеспечивающее прослушивание ближайшего провайдера, который мы уже реализовали выше в дереве виджетов. (Учитывая, что я уже закончил рисовать свой конструктор ListView под виджетом FutureProvider)

..getList() async{
    Consumer<ChallengeViewProvider>(
        builder: (_, foo, __) => Text(
            '${foo.count}',
        ),
    );

    List _result = await db....
    _result.forEach((_item){
        addToList(Button(
            onTap: () => increment();
            child: Text('Press'),
        ));
    });
}

Я также реорганизовал свои виджеты и вытащил кнопку Button как виджет без состояния для повторного использования. Хотя убедитесь, что ссылочные кнопки подписаны на того же родительского провайдера, имеющего значение Counter, и чтобы свойство onTap вызывало функцию increment () через Provider <>. *

Надеясь, что это поможет любому в будущем!

...