flutter 如何在处理页面时清除块中的数据?

c7rzv4ha  于 2023-01-14  发布在  Flutter
关注(0)|答案(2)|浏览(189)

我在flutter应用程序的第二个页面上使用flutter_bloc,当我处理此页面时(如导航回第一个页面),如何清除bloc的数据?

brccelvz

brccelvz1#

Bloc正在使用流,除非你发出新事件,否则状态不会更改。如果你想在导航到其他路线后“清除”Bloc,你可以发出一个事件,该事件在@override initS中生成Bloc的initialState

7ivaypg9

7ivaypg92#

如果其他人试图清除区块数据(例如,在注销后),扩展可能是一个很好的方法。例如,如果您有一个类似下一个的区块:

class TableUIBloc extends Bloc<TableUIEvent, TableUIState> {
  TableUIBloc() : super(TableUIInitial()) {
    on<TableUIEvent>((event, emit) {
      switch (event.runtimeType) {
        case UpdateShowedColumns:
          // The columns the user is trying to show
          final showedColumns = (event as UpdateShowedColumns).showedColumns;

          // updating the showed columns
          emit(
            TableUIUpdated(
              showedColumns: showedColumns
            ),
          );
          break;
      }
    });
  }
}
@immutable
abstract class TableUIEvent {}

/// Updates the list of showed columns on the table
class UpdateShowedColumns extends TableUIEvent {
  final List<TableColumn> showedColumns;

  UpdateShowedColumns({
    required this.showedColumns,
  });
}
@immutable
abstract class TableUIState {
  final List<TableColumn> showedColumns;

  const TableUIState({
    required this.showedColumns,
  });
}

class TableUIInitial extends TableUIState {
  TableUIInitial()
      : super(
          showedColumns: [
            TableColumn.stone,
            TableColumn.rating,
            TableColumn.team,
          ]
        );
}

您可以创建一个扩展并添加"清理"块数据的功能,发出块的初始状态:

/// An extension to reset a bloc to its default state.
extension BlocReset on Bloc {
    void reset(dynamic initialState) {
        // ignore: invalid_use_of_visible_for_testing_member
        emit(initialState);
    }
}

因此,当你想清理一个已确定的块的状态时,你只需要导入扩展并在代码的某个地方调用'reset'方法,并提供初始状态数据类型:

import 'package:your_project/path/to/extension.bloc.dart';

(context.read<TableUIBloc>()).reset<TableUIInitial>();

当你有很多块,并且你想把它们都清理掉,而不需要创建一个新的事件来把每个块的状态恢复到初始值时,这是很有用的。下面是我如何清理我正在开发的系统上所有块的数据的一个例子。

// Cleaning all the blocs
(context.read<ClientBloc>()).reset(ClientInitial());
(context.read<TeamBloc>()).reset(TeamInitial());
(context.read<StoneBloc>()).reset(StoneInitial());
(context.read<AuthBloc>()).reset(AuthInitial());
(context.read<CalendarBloc>()).reset(const CalendarInitial());
(context.read<ColorBloc>()).reset(ColorInitial());
(context.read<OAuthBloc>()).reset(OAuthInitial());
(context.read<TableUIBloc>()).reset(TableUIInitial());
(context.read<OpportunityBloc>()).reset(OpportunityInitial());
(context.read<UserBloc>()).reset(UserInitial());

相关问题