#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);
}
},
),
),
),
),
);
}