#flutter #dart
#flutter #dart
Вопрос:
Я добавляю объект в контроллер потока, но во время печати он показывает только последний добавленный мной объект. Не предыдущие. Они теряются. Когда я добавляю новый объект, новый объект отображается только, а предыдущие теряются.Для примера я добавляю {"hello":"hi", }
3 раза, но он показывает, что я добавил только 1 раз. Можете ли вы проверить, неверен ли мой код? В основном это приложение для чата, поэтому всякий раз, когда кто-то отправляет сообщение, оно добавляется в stream controller. Это контроллер потока
final socketResponse= StreamController();
Stream get getResponse =>socketResponse.stream;
@override
void dispose() {
socketResponse.close();
super.dispose();}
Я добавил данные, используя
RaisedButton(onPressed: (){ print("clicked"); socketResponse.add({"hello":"hi",}) ; },child: Text("click me"),),
Прослушал данные, используя следующий код
StreamBuilder(
stream: getResponse ,
builder: (BuildContext context, AsyncSnapshot snapshot){
`
if(!snapshot.hasData){
return CircularProgressIndicator();
}
return ListView.builder
(
itemCount:snapshot.data.length,
itemBuilder:(BuildContext context, index){
print(snapshot.data);
return ListTile(
title:Text(snapshot.data['hello']),
);
});
},
), `
когда я нажимаю кнопку 5 раз {«привет»:»привет»,
} будет добавлено 5 раз, но когда я печатаю значение stream, печатается только 1 {«привет»: «привет»,}
где, поскольку этот объект должен был отображаться как {«привет»:»привет»,},{«привет»: «привет»,},{«привет»: «привет»,},{«привет»: «привет»,}, {«привет»: «привет»,} это
подсказывает мне, как я могу решить проблему
Ответ №1:
Я не совсем уверен в том, как использовать StreamController, поэтому я даю только подход из логики, которую я обычно использовал в RxDart
socketResponse.add({"hello":"hi",}) ; }
это используется для добавления вашего значения в ваш приемник, поэтому оно заменяет не добавляющее значение внутри вашего StreamController, если вы хотите добавить в свой приемник, вам нужно получить значение из вашего предыдущего приемника и добавить в свой новый приемник
например:
final Map<String,dynamic> value = socketResponse.value;
final Map<String,dynamic> tempMap = <String,dynamic>[];
tempMap.addAll(value);
socketResponse.add(value);