Flutter BLoC库:将TextEditingController对象保存在何处:在State、BLoC/Cubi



使用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类中。这是一种正确的方法吗?

这里有人问了图书馆作者同样的问题,Felix Angelov(flatter_bloc的作者(的答案是:

我强烈建议不要将TextEditingController作为集团的一部分进行维护。理想情况下,Blob应该是平台无关的,并且不依赖Flutter。如果您需要使用TextEditingControllers,我建议您创建一个StatefulWidget,并将其作为State类的一部分进行维护。然后,您可以通过BlocListener 与控件接口,以响应状态更改

就我个人而言,我把我的保留在我的Cubit类中。原因是我很可能会在某个时候使用控制器的结果。为了保持整洁,我在Cubit中引用控制器的文本,而不是通过事件传递文本。

另一个原因是,您可以订阅Cubit中控制器的事件,如addListener,这将被视为";商业逻辑";。

我建议不要在blocs或ought中使用TextEditingControllers,因为对我来说,这是一个UI级别,不应该传递给上面的逻辑。

如果使用挂钩,"动画"或"文本"控制器的问题就会消失。HookWidget内部的代码如下所示:

final titleTextController = useTextEditingController(text: book?.title ?? '');

我可以向它添加监听器,并在更改时调用一些方法,或者只获取当前文本,而不关心处理,因为这是自动发生的。

其他挂钩包括useContext()useState()。更多关于钩子的信息,请参阅我的Flutter肘+钩子教程。

我认为将其保存在Bloc Cubit中是一个很好的选择,因为假设您在一个页面中用一些部分(即窗体中的General sections、intro sections(来分隔小部件。想象一下,将TextEditingController从父小部件传递给所有子小部件。只需保持在cuit或bloc中,用blocbuilder包装parents小部件,然后从任何地方读取。

最新更新