我在Flutter中使用bloc状态管理时,它会被自动处置?

问题描述 投票:0回答:1

如何防止集体处置? 我希望何时何地处置它?

当状态没有变化,但是该状态自带的值,比如列表,当它变化的时候,ui并没有注意到该值随着状态的变化。必须更改状态以便用户界面能够理解。我该如何处理这个问题?

flutter bloc dispose state-management
1个回答
2
投票

Bloc(业务逻辑组件)包(例如 Flutter 中的 flutter_bloc 和 bloc)为您提供了一种控制应用程序状态并通知 UI 更改的方法。使用 Bloc 的小部件的生命周期和范围决定了它是否应该被丢弃。

以下是处置 Bloc 的一些注意事项:

  1. 作用域为 Widget 的生命周期:如果您希望在从 Widget 树中删除 Widget 时(例如,当在导航堆栈中弹出页面时)删除 Bloc,则通常应该使用 flutter_bloc 包中的 BlocProvider 或 BlocListener )。当小部件从小部件树中删除时,这些小部件会自动处理 Bloc 的处理。

     BlocProvider(
       create: (context) => DesiredBloc(),
       child: DesiredWidget(),
     )
    
  2. 全局范围:如果 Bloc 需要在应用程序的生命周期内持续存在,您可能不想删除它。在这种情况下,您可以在应用程序中更高级别(例如在主函数中)处理 Bloc,并在应用程序使用期间保持其活动状态。

  3. 手动处置:在小部件的丢弃方法中,如果您需要更精确地控制何时处置 Bloc,则可以手动处置 Bloc。例如:

     class YourWidget extends StatefulWidget {
       @override
       _YourWidgetState createState() => _YourWidgetState();
     }
    
     class _YourWidgetState extends State<YourWidget> {
       final YourBloc _yourBloc = YourBloc();
    
       @override
       void dispose() {
         _yourBloc.close();
         super.dispose();
       }
    
       @override
       Widget build(BuildContext context) {
         return BlocProvider(
           create: (context) => _yourBloc,
           child: YourChildWidget(),
         );
       }
     }
    

关于第二个查询,您可以通过使用 Equatable 或类似方法来解决此问题,以确保当值发生变化时,即使状态本身没有变化,也会以不同的方式处理状态对象。

  1. 使用 Equatable:您可以覆盖状态类中的 props 函数,通过扩展 Equatable 来比较状态内的值。这样,因为当值改变时,状态对象被视为不同,因此会导致 UI 更新。

     class YourState extends Equatable {
       final List<int> data;
    
       YourState(this.data);
    
       @override
       List<Object?> get props => [data];
     }
    
  2. 克隆状态:在某些情况下,可能需要克隆状态才能强制 UI 更新。例如:

     void updateData(List<int> newData) {
       final currentState = state;
       final newState = YourState([...currentState.data, ...newData]);
       emit(newState);
     }
    

即使状态对象引用保持不变,您也可以通过使用修改后的值创建新的状态对象并发出它来导致 UI 更新。

请记住,Flutter 框架是为了在状态保持静态时更有效地渲染页面,因此应谨慎执行强制更新,以防止不必要的 UI 重新渲染。

© www.soinside.com 2019 - 2024. All rights reserved.