我应该在带有equatable和flutter_bloc的模型中使用final来区分2个状态吗?

问题描述

我正在创建一个应用程序,您可以在该应用程序上登录并进入具有餐厅列表的页面,还有一个可以在其中添加新餐厅的表格。

这部分有效。

问题是,当我单击添加时,餐厅已正确添加到firestore中,但列表未刷新。我通常会产生2个状态,一个LoadingState和一个LoadedRestaurantsListState,但是对于flutter_bloc的最新版本而言,此技巧不起作用,似乎只收到了所产生的最后一个状态,但是前一个是LoadedRestaurantsListState,因此它们相等,并且blocbuilder忽略第二个。因此,我必须使用equatable的道具来区分这两种状态,但是在equatable文档中写道:“ 注意:Equatable设计为仅适用于不可变对象,因此所有成员变量必须为final ”。

因此,我必须使模型的所有字段最终确定,但是如果我这样做,我该如何在需要时仅修改一两个字段? 最佳做法是什么? 如果有人有示例或视频等,将不胜感激。 预先感谢

没有道具

FirebaseBloc.dart

 Stream<FirebaseState> mapEventToState(
    FirebaseEvent event,) async* {
    print("event firebase ${event.runtimeType.toString()}");
       
    if (event is CreateRestaurantFirebaseEvent) {
      yield LoadingState();
      await _databaseService.createRestaurant(event.restaurant,event.user);
      List<Restaurant> restaurantsList = await _databaseService
          .loadRestaurantsList(event.user.restaurantsIDsList);
      yield LoadedRestaurantsListState(restaurantsList);
    }

    if (event is LoadRestaurantsListEvent) {
      List<Restaurant> restaurantsList =
          await _databaseService.loadRestaurantsList(event.restaurantsIDs);
      yield LoadedRestaurantsListState(restaurantsList);
    }

FirebaseState.dart

class LoadingState extends FirebaseState {
  @override
  List<Object> get props => [];
}

class LoadedRestaurantsListState extends FirebaseState {
  List<Restaurant> restaurantsList;

  LoadedRestaurantsListState(this.restaurantsList);

  @override
  List<Object> get props => [];
}

view.dart

class RestaurantSelectionScreen extends StatefulWidget {
  final User user;

  RestaurantSelectionScreen({
    @required this.user,});

  @override
  _RestaurantSelectionScreenState createState() =>
      _RestaurantSelectionScreenState();
}

class _RestaurantSelectionScreenState extends State<RestaurantSelectionScreen> {
  FirebaseBloc _firebaseBloc;

  @override
  void initState() {
    super.initState();

    _firebaseBloc = FirebaseBloc();
    _firebaseBloc.add(LoadRestaurantsListEvent(widget.user.restaurantsIDsList));
  }

  @override
  Widget build(BuildContext context) {
    return BlocProvider<FirebaseBloc>(
      create: (context) => _firebaseBloc,child: Scaffold(
        body: SingleChildScrollView(
          child: Center(
            child: BlocBuilder(
              cubit: _firebaseBloc,builder: (context,state) {
                print("state ${state.runtimeType.toString()}");

                if (state is InitialFirebaseState) {
                  return CircularProgressIndicator();
                } else if (state is LoadedRestaurantsListState) {
                  return buildUI(state);
                } else if (state is LoadingState) {
                  return CircularProgressIndicator();
                } else {
                  return _CreateRestaurantFormWidget(widget.user);
                }
              },),);
  }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...