每当我使用flutter_bloc

时间:2020-02-08 05:51:48

标签: flutter

在使用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重置为其初始值?

如果该值始终保持原样/存储,它将破坏我的应用程序。

2 个答案:

答案 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事件,只需确保将作用域仅作用于需要它的小部件树的一部分。希望有帮助!