在使用flutter_bloc
时,我仍然是一个初学者。
我尝试过flutter_bloc
,并且好奇如何在关闭页面后将自己的bloc类重置为其初始值。
my_bloc_class.dart
class sumtotal_detail_transactionsbloc extends Bloc<String, String>{
@override
String get initialState => '0';
@override
Stream<String> mapEventToState(String sumtotal_detail_transactions) async* {
yield sumtotal_detail_transactions.toString();
}
}
带有BlocBuilder
的小部件。
BlocBuilder<sumtotal_detail_transactionsbloc, String>(
builder: (context,sumtotal_detail_transactions) => Text(
sumtotal_detail_transactions,style: TextStyle(
fontSize: 12,
color: Colors.brown[300]
),
)
),
每当我关闭页面或导航到页面时,如何始终/自动将sumtotal_detail_transactions
重置为其初始值?
如果该值始终保持原样/存储,它将破坏我的应用程序。
答案 0 :(得分:1)
如插件作者here所述,
我认为引入reset()并不是一个好主意,因为它直接违背了bloc库范例:触发状态更改的唯一方法是调度事件。
话虽如此,您必须添加一个事件/状态,它将用于触发初始化事件。
例如:
添加初始化事件。
some_page_bloc_events.dart
class InitializePageEvent extends SomePageEvent {
// You could also pass on some values here, if they come from the UI/page of your app
@override
String toString() => 'InitializePageEvent';
}
添加初始化状态。
some_page_bloc_states.dart
class InitializePageState extends SomePageState {
@override
String toString() => 'InitializePageState';
}
接下来,在您的bloc类中利用这些内容过滤进入的事件,并以适当的状态通知UI。
some_page_bloc.dart
@override SomePageState get initialState => InitializePageState();
@override
Stream<SomePageState> mapEventToState(SomePageEvent event) async* {
try {
if(event is InitializePageEvent) {
// Do whatever you like here
yield InitializePageState();
}
} catch (e) {
...
}
}
最后,您可以在有需要的地方调用初始化事件。对于您来说,它应该在屏幕上的initState()
方法上。
some_page.dart
@override
void initState() {
super.initState();
_someTransactionBloc.dispatch(InitializePageEvent());
}
Felix为他的插件提供了写得很好的文档,我建议您仔细阅读BLoC如何工作的介绍概念。请阅读here。
答案 1 :(得分:1)
嘿?我建议在页面中提供块,以便在关闭页面时BlocProvider会自动处置该块。无需发生reset事件,只需确保将作用域仅作用于需要它的小部件树的一部分。希望有帮助!