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 {}