问题描述
在使用 BLoC 库时,我们将所有变量存储在一个状态类中。但是在哪里存储TextEditingController,它不会改变,但它的值会改变?
@freezed
abstract class EditItemState with _$EditItemState {
const factory EditItemState.updated({
TextEditingController titleController,ShoppingItem shoppingItem,}) = _ShoppingListLoaded;
}
还有 Cubit 类:
class EditItemCubit extends Cubit<EditItemState> {
EditItemCubit() : super(EditItemState.updated());
Future<void> titleUpdated() async {
emit(
EditItemState.updated().copyWith(
shoppingItem: state.shoppingItem.copyWith(
title: state.titleController.text,),);
}
}
所以 Cubit 类的逻辑看起来很混乱。我建议将此类控制器直接保存在小部件或 BLoC/Cubit 类中。这是一种正确的方法吗?
解决方法
就我个人而言,我一直在我的 Cubit 班级中保留我的。这样做的原因是因为我很可能会在某个时候使用该控制器的结果。为了保持整洁,我在 Cubit 中引用了控制器的文本,而不是通过事件传递文本。
另一个原因是因为您可以订阅 Cubit 中控制器的事件,例如 addListener
,这将被视为“业务逻辑”。
Here 人向图书馆作者提出了同样的问题,Felix Angelov(flutter_bloc 的作者)的回答是:
我强烈建议不要将 TextEditingController 维护为集团的一部分。理想情况下,Bloc 应该与平台无关,并且不依赖于 Flutter。如果您需要使用 TextEditingControllers,我建议您创建一个 StatefulWidget 并将它们作为 State 类的一部分进行维护。然后你可以通过 BlocListener 与控件交互以响应状态变化