Продолжить заполнение списка, возможно, с Custom Stream в Flutter - PullRequest
0 голосов
/ 23 января 2019

Будучи новичком во 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) { ... }
    }
...