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

时间:2020-10-02 10:01:02

标签: flutter final bloc

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

这部分有效。

问题是,当我单击添加时,餐厅已正确添加到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);
                }
              },
            ),
          ),
        ),
      ),
    );
  }

0 个答案:

没有答案