我正在创建一个应用程序,您可以在该应用程序上登录并进入具有餐厅列表的页面,还有一个可以在其中添加新餐厅的表格。
这部分有效。
问题是,当我单击添加时,餐厅已正确添加到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);
}
},
),
),
),
),
);
}