Должен ли я использовать final в моделях с equatable и flutter_bloc для различения 2 состояний?

#flutter #final #bloc

#flutter #Финал #блок

Вопрос:

Я создаю приложение, в котором вы входите в систему и переходите на страницу, где у вас есть список ваших ресторанов, у вас также есть форма, в которой вы можете добавить новый ресторан.

Эта часть работает.

Проблема в том, что когда я нажимаю добавить, ресторан добавляется в firestore правильно, но список не обновляется. Обычно я выдаю 2 состояния, LoadingState и LoadedRestaurantsListState, но с последней версией flutter_bloc этот трюк не работает, похоже, получено только последнее полученное состояние, но предыдущее было LoadedRestaurantsListState, поэтому они равны, а blockbuilder игнорирует второе. Итак, я должен использовать реквизит equatable для различения 2 состояний, но в документации 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);
                }
              },
            ),
          ),
        ),
      ),
    );
  }