Будучи новичком во Flutter, я увидел очень хороший пример широковещательного StreamController в этом видео здесь (которое использует изображения из URL).
У меня есть следующая проблема, которую я хотел бы решить. (и я думал о ее решении с помощью потока во Флаттере - может быть, это неправильный подход, и вы дадите мне знать;)).
В настоящее время я использую SQL-запрос, который в конечном итоге находит группу элементов, которые заполняются в списке. Эта часть отлично работает. И я использую FutureBuilder
для представления списка после того, как его элементы были запрошены из SQLite-DB. БД очень большая, и запрос занимает время.
Теперь проблема: я хочу запросить больше данных. И вместо того, чтобы заставлять пользователя ждать запрос-2, 3, 4 и 5, я хотел бы показать список из запроса-1 и в конечном итоге (динамически) добавить результаты запроса-2, 3, 4 и 5 к тому же список (т. е. возможно добавление вновь найденных элементов или, что еще лучше, динамическое обновление списка в отсортированном порядке, вставка новых элементов по мере их обнаружения). Поэтому обновления списка должны происходить сразу после каждого запроса, поэтому пользователь видит, что список все больше заполняется новыми результатами запросов.
Я подумал об использовании потока, который в конечном итоге направляет новые результаты запроса в тот же список.
Возможно ли это вообще - и если да, то как бы я это сделал?
Ниже приведен пробный код, который еще не работает. Как мне реализовать собственный поток?
class MyClassState extends State<MyClass> {
StreamController<MyCustomList> streamController;
List<MyCustomList> list = [];
@override
void initState() {
super.initState();
streamController = StreamController.broadcast();
streamController.stream.listen((p) => setState(() => list.add(p)));
load(streamController);
}
load(StreamController<MyCustomList> sc) async {
final StateContainerState container = StateContainer.of(context);
var streamedRes = await queryMyDB(container.someData.someProperty);
streamedRes.stream // ????????????? Here is the exception ???????
.transform(utf8.decoder)
.transform(json.decoder)
.expand((e) => e)
.map((map) => MyCustomList.fromJsonMap(map))
.pipe(sc);
}
@override
void dispose() {
super.dispose();
streamController?.close();
streamController = null;
}
@override
Widget build(BuildContext context) { ... }
}