flutter 扑动BLoC库:保存TextEditingController对象的位置:在状态、BLoC / Cubit类或小部件中?

e3bfsja2  于 2023-01-10  发布在  Flutter
关注(0)|答案(3)|浏览(155)

在使用BLoC库时,我们将所有变量存储在一个状态类中。但是在哪里存储TextEditingController,它不会改变,但它的值会改变?
假设我有一个如下的状态类(仅作为示例):

@freezed
abstract class EditItemState with _$EditItemState {
  const factory EditItemState.updated({
    TextEditingController titleController,
    ShoppingItem shoppingItem,
  }) = _ShoppingListLoaded;
}

腕尺类:

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类的逻辑看起来比较混乱,我建议把这样的控制器直接放在widget中或者放在BLoC/Cubit类中,这样做对吗?

mbzjlibv

mbzjlibv1#

Here的人问了库作者同样的问题,Felix Angelov(flutter_bloc的作者)的答案是:
我强烈建议不要将TextEditingController作为块的一部分来维护。理想情况下,块应该是平台无关的,并且不依赖于Flutter。如果您需要使用TextEditingController,我建议创建一个StatefulWidget,并将它们作为State类的一部分来维护。然后,您可以通过BlocListener与控件交互以响应状态更改

chhqkbe1

chhqkbe12#

就我个人而言,我一直把我的放在我的Cubit类中。这样做的原因是因为我很可能会在某个时候使用那个控制器的结果。为了保持简洁,我引用了Cubit中的控制器文本,而不是通过事件传递文本。
另一个原因是因为您能够订阅Cubit内控制器的事件,如addListener,这将被视为“业务逻辑”。

tcomlyy6

tcomlyy63#

我建议不要在块或肘中使用TextEditingControllers,因为对我来说,这是一个UI级别,不应该传递给上面的逻辑。
如果使用hooks,动画或文本控制器的问题就会消失。HookWidget内部的代码如下所示:

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

我可以向它添加侦听器,并在发生变化时调用一些方法,或者只获取当前文本,而不关心处理,因为它是自动发生的。
其他钩子包括useContext()useState()。更多关于钩子的信息请参见我的Flutter cubits + hooks tutorial

相关问题