Flutter BLoC 库:将 TextEditingController 对象保存在哪里:在 State、BLoC / Cubit 类中还是在小部件中?
Posted
技术标签:
【中文标题】Flutter BLoC 库:将 TextEditingController 对象保存在哪里:在 State、BLoC / Cubit 类中还是在小部件中?【英文标题】:Flutter BLoC library: Where to keep the TextEditingController object: in State, in BLoC / Cubit class or in the widget? 【发布时间】:2021-04-16 18:45:53 【问题描述】:在使用 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 类中。这是一个正确的方法吗?
【问题讨论】:
【参考方案1】:就我个人而言,我将我的保持在我的 Cubit 类中。这样做的原因是因为我很可能会在某个时候使用该控制器的结果。为了保持整洁,我在 Cubit 中引用了控制器的文本,而不是通过事件传递文本。
另一个原因是您可以订阅 Cubit 内控制器的事件,例如 addListener
,这将被视为“业务逻辑”。
【讨论】:
听起来很有道理,谢谢你的回答! 不客气!如果这个回答对你有帮助,别忘了采纳哦?【参考方案2】:Here 伙计们向图书馆作者提出了同样的问题,Felix Angelov(flutter_bloc 的作者)的回答是:
我强烈建议不要将 TextEditingController 作为集团的一部分进行维护。理想情况下,Bloc 应该与平台无关,并且不依赖于 Flutter。如果您需要使用 TextEditingControllers,我建议您创建一个 StatefulWidget 并将它们作为 State 类的一部分进行维护。然后您可以通过 BlocListener 与控件交互以响应状态更改
【讨论】:
以上是关于Flutter BLoC 库:将 TextEditingController 对象保存在哪里:在 State、BLoC / Cubit 类中还是在小部件中?的主要内容,如果未能解决你的问题,请参考以下文章
在flutter中使用Chopper网络库和flutter_bloc库
flutter_bloc - 每个 Bloc 有多个存储库,还是只有一个?
flutter_bloc - 为啥在 UI 而不是后端声明存储库?