Как обновить старые значения в листе
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
→ Ссылка
- Не вижу в коде где в mList добавляются данные. (
mList.add();ничего не добавляет) - Даже если они и менялись у вас нет триггера на перерисовку второго списка (mList). Виджеты у которых на конце есть
Builderназываются не просто так, это означает что данный виджет будет вызывать в себе методsetState()при каком либо триггере. Как например уStreamBuilderон изменяется из-за того, что изменяются данные вStream. АStreamэто всего лишь паттерн Observer + Iterator, т.е. мы можем посмотреть какие данные сейчас актуальные (как в Excel, когда мы меняем где-то данные, а формула сама делает перерасчет).
А для решения вашей задачи можно использовать StreamController<T>.broadcast чтобы прослушивать один Stream в разных местах.