setState с Stream, не вызывающим сборку - PullRequest
0 голосов
/ 09 мая 2020

Я хочу использовать Stream для загрузки данных из файла и обновления статуса выполнения, однако setState не работает.

Я хочу, чтобы статус был установлен на 1, затем 2, затем 3, но в конце он просто устанавливается от 0 до 3. setState не вызывает сборку сразу.

Я тоже безуспешно пробовал stream.listen и ondata. Не уверен, что мне нужно делать или что я делаю не так.

ОБНОВЛЕНИЕ: Из того, что я читал, мне придется глубже изучить архитектуру Provider или blo c. Вроде решает эту проблему. Если у кого-то есть решение, дайте мне знать.

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as Path;

class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  int _progressCount = 0;
  Stream<String> _stream;

  @override
  void initState() {
    _stream = Stream.fromIterable(['a', 'b', 'c', 'd', 'e', 'f']);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    print('build called');
    return Scaffold(
        appBar: AppBar(),
        body: Center(
            child: Column(
          children: <Widget>[
            Text('Progress $_progressCount'), // I want this to be set to 0,1,2,3
            RaisedButton(
             onPressed: () async {
                print(_progressCount);
                int i = 0;
                //test 1
                await _stream.forEach((line) {
                  i++;
                  if (i % 2 == 0) {
                    print(line);
                    setState(() {
                      // this is not triggering build function
                      _progressCount = _progressCount + 1;
                    });
                  }
                });
              },
              child: Text('Process'),
            )
          ],
        )));
  }
}
...