使用flutter_bloc在flutter的状态更改期间触发事件是否是一种好习惯(或至少可能)? 如:
if (state is SomeState) {
_bloc.add(Event())
}
在这种情况下,我的用例是触发模式作为对某些状态更改的反应,但是每次我执行此操作(与BlocListener和BlocBuilder一起尝试)时,模式始终会触发两次,因为您必须关闭2个模式。 / p>
我必须这样做,因为我进行了2次api调用,每个事件触发一个调用,例如PostEvent和GetEvent,并且我希望模式仅在第二个完成后才打开。
PostEvent->请求-> StateChange->构建器-> add(GetEvent)->请求-> StateChange->构建器-> showModal()
我还想知道我是否应该使用相同的方法进行两个调用,但尚未进行测试。
经过一番挖掘,我发现即使事件仅添加一次,该小部件仍以相同状态(例如GetFinished)重建了2次,因此显示了2个模态。
任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
如果我理解正确,我建议您这样做:
1-使您的全状态窗口小部件在initState上监听bloc.stream(记住在处理时取消订阅)
2-在收听新数据时,您触发该模式
3-请求后,您调用_bloc.add()
方法以触发模态。
4-例子:
import 'dart:async';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('test')),
body: BodyWidget(),
),
);
}
}
class BodyWidget extends StatefulWidget {
@override
BodyWidgetState createState() {
return new BodyWidgetState();
}
}
class BodyWidgetState extends State<BodyWidget> {
StreamSubscription subscription;
@override
void initState(){
super.initState();
subscription = _bloc.yourStream$.listen((data) async {
await showDialog(context: context);
});
}
@override
void dispose() {
subscription?.cancel();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container();
}
}
如您所见,我只是在谈论流,而不使用任何外部第3个程序包。
这应该正常工作