Flutter BLoC 库:在哪里保存 TextEditingController 对象:在 State 中、在 BLoC / Cubit 类中还是在小部件中?

Tho*_*mas 16 architecture flutter bloc cubit

使用 BLoC 库时,我们将所有变量存储在状态类中。但是在哪里存储 TextEditingController,它不会改变,但它的值会改变?

假设我有一个像这样的状态类(仅作为示例):

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

和肘级:

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,
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

所以Cubit类逻辑看起来很混乱。我建议将此类控制器直接保留在小部件或 BLoC/Cubit 类中。这是正确的做法吗?

K.A*_*nov 29

这里,人们向库作者提出了同样的问题,Felix Angelov(flutter_bloc 的作者)的答案是:

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