Flutter 颤振集团如何停止事件内的执行循环?

Flutter 颤振集团如何停止事件内的执行循环?,flutter,bloc,Flutter,Bloc,我将提供程序与变更通知程序一起使用,但在其中我需要制作一个流控制器,用于处理数据。例如,假设有一个站点列表 class ExampleProvider extends ChangeNotifier { //list of sites for data processing final List<String> _weblinks = []; ExampleProvider() { //Fill in demo data _weblinks

我将
提供程序
变更通知程序
一起使用,但在其中我需要制作一个
流控制器
,用于处理数据。例如,假设有一个站点列表

class ExampleProvider extends ChangeNotifier {
  
  //list of sites for data processing
  final List<String> _weblinks = [];

  ExampleProvider() {
    
    //Fill in demo data
    _weblinks.add("https://stackoverflow.com/");
    _weblinks.add("https://github.com");
    _weblinks.add("http://microsoft.com");
    
    //subscribe to the stream in the constructor
    eventStream.listen((event) async {
      if (event is StartProcessing) {
        for (var i = 0; i < _weblinks.length; i++) {
          
          //Doing some fake calculations
          await Future.delayed(Duration(seconds: 3));
          
          //add the result to the stream
          dataSink.add(_weblinks[i]);
        }
      }

      if (event is FinishProcessing) {}
    });
  }

  final _streamController = StreamController<String>.broadcast();
  Stream<String> get dataStream => _streamController.stream;
  StreamSink<String> get dataSink => _streamController.sink;

  final _eventController = StreamController<StreamControllerAction>.broadcast();
  Stream<StreamControllerAction> get eventStream => _eventController.stream;
  StreamSink<StreamControllerAction> get eventSink => _eventController.sink;

}

如果要停止侦听eventStream,可以将其订阅保存在StreamSubscription对象中,然后可以访问.pause()和.resume()

当您使用stream.listen()时,它将返回一个StreamSubscription,您可以将其保存在变量中,稍后使用


您可以在文档中阅读更多关于它的信息

也许我不理解您的想法,但我不需要停止收听或暂停eventStream。好吧,在这种情况下,我想我不理解您想要实现的目标。对不起,我的朋友:)谢谢你的帮助。假设我在流中运行一个无限循环,我需要在按下按钮时中断它。我不需要暂停。我不需要取消订阅,因为我以后会重新启动它。
void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [
          ChangeNotifierProvider.value(
            value: ExampleProvider(),
          ),
        ],
        child: MaterialApp(
          home: MyHomePage(),
        ));
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            StreamBuilder<String>(
              initialData: null,
              stream: Provider.of<ExampleProvider>(context, listen: false)
                  .dataStream,
              builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
                List<Widget> children;
                if (snapshot.hasError) {
                  children = <Widget>[Text("error")];
                } else {
                  switch (snapshot.connectionState) {
                    case ConnectionState.waiting:
                      children = <Widget>[
                        ElevatedButton(
                          child: Text("processing data"),
                          onPressed: () {
                            Provider.of<ExampleProvider>(context, listen: false)
                                .eventSink
                                .add(StartProcessing());
                          },
                        ),
                      ];
                      break;

                    default:
                      {
                        children = <Widget>[
                          Column(
                            children: [
                              ElevatedButton(
                                child: Text("finish"),
                                onPressed: () {},
                              ),
                              Text(snapshot.data),
                            ],
                          )
                        ];
                      }
                      break;
                  }
                }

                return Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  crossAxisAlignment: CrossAxisAlignment.center,
                  children: children,
                );
              },
            )
          ],
        ),
      ),
    );
  }
}

class ExampleProvider extends ChangeNotifier {
  final List<String> _weblinks = [];

  ExampleProvider() {
    _weblinks.add("https://stackoverflow.com/");
    _weblinks.add("https://github.com");
    _weblinks.add("http://microsoft.com");

    eventStream.listen((event) async {
      if (event is StartProcessing) {
        for (var i = 0; i < _weblinks.length; i++) {
          await Future.delayed(Duration(seconds: 3));
          dataSink.add(_weblinks[i]);
        }
      }

      if (event is FinishProcessing) {}
    });
  }

  final _streamController = StreamController<String>.broadcast();
  Stream<String> get dataStream => _streamController.stream;
  StreamSink<String> get dataSink => _streamController.sink;

  final _eventController = StreamController<StreamControllerAction>.broadcast();
  Stream<StreamControllerAction> get eventStream => _eventController.stream;
  StreamSink<StreamControllerAction> get eventSink => _eventController.sink;

 
}

abstract class StreamControllerAction {}

class StartProcessing extends StreamControllerAction {}

class FinishProcessing extends StreamControllerAction {}