Как обновить старые значения в листе

List<Music> mList = List<Music>();
      Music music = Music();
    @override
    Widget build(BuildContext context) {
      return Scaffold(
        body: Column(
          children: [
            Container(
              child: StreamBuilder(
                  stream: fr.getList(),
                  builder: (BuildContext context, AsyncSnapshot snapshot) {
                    if (!snapshot.hasData) {
                      return Text('0');
                    } else if (snapshot.hasError) {
                      return Text('error');
                    }
                    List<Music> list = snapshot.data;
                    return Expanded(
                      child: ListView.builder(
                          itemCount: list.length,
                          itemBuilder: (context, i) {                        
                            return Column(
                              children: [
                                SizedBox(height: 50),
                                Container(
                                  child: InkWell(
                                    child: Text(list[i].name),
                                    onTap: () {},
                                  ),
                                ),
                              ],
                            );
                          }),
                    );
                  }),
            ),
            RaisedButton(onPressed: () {
               setState({
                  mList.add();
                       });
               },
             child: Text('add'),
                             ),
            SizedBox(height: 50),
            Expanded(
              child: ListView.builder(
                itemCount: mList.length,
                itemBuilder: (BuildContext context, int i) {
                  return Center(
                    child: Text(mList[i].name),
                  );
                },
              ),
            )
          ],
        ),
      );
    }

Если изменить данные объекта в базе то streambuilder сразу же показывает изменения. Добавляю в пустой лист объект, данный пустой лист просто инициализирован в виджете. При изменении данных в базе, данные объекта в листе остаются прежними. Как сделать чтоб данные объекта так же менялись?


Ответы (1 шт):

Автор решения: MiT
  1. Не вижу в коде где в mList добавляются данные. (mList.add(); ничего не добавляет)
  2. Даже если они и менялись у вас нет триггера на перерисовку второго списка (mList). Виджеты у которых на конце есть Builder называются не просто так, это означает что данный виджет будет вызывать в себе метод setState() при каком либо триггере. Как например у StreamBuilder он изменяется из-за того, что изменяются данные в Stream. А Stream это всего лишь паттерн Observer + Iterator, т.е. мы можем посмотреть какие данные сейчас актуальные (как в Excel, когда мы меняем где-то данные, а формула сама делает перерасчет).

А для решения вашей задачи можно использовать StreamController<T>.broadcast чтобы прослушивать один Stream в разных местах.

→ Ссылка