flutter_block : BlockProvider vs. RepositoryProvider

标签 flutter flutter-bloc

我想澄清一下 BlocProviderRepositoryProvider .从官方 API 引用来看,它们提供了相同的功能——它们为它的后代小部件提供了一个对象的实例。
但是,从名称来看,我猜 BlocProvider应该用于 Bloc仅限对象,以及 RepositoryProvider对于其他一切。它是否正确?

最佳答案

RepositoryProvider 的行为类似于 Repository 模式
它的数据提供者向 Bloc 提供数据,因此 Bloc 不需要知道数据来自云或 sqflite 或......
并进行合并/过滤,请参见下面的官方示例

在下面的 LoginForm 示例中
存储库是 Bloc 的一部分,您可以使用 _userRepository.login

class LoginFormBloc extends FormBloc<String, String> {
      final emailField = TextFieldBloc(validators: [Validators.email]);
      final passwordField = TextFieldBloc();

      final UserRepository _userRepository;

      LoginFormBloc(this._userRepository);

      @override
      List<FieldBloc> get fieldBlocs => [emailField, passwordField];

      @override
      Stream<FormBlocState<String, String>> onSubmitting() async* {
        try {
          _userRepository.login(
            email: emailField.value,
            password: passwordField.value,
          );
          yield currentState.toSuccess();
        } catch (e) {
          yield currentState.toFailure();
        }
      }
    }

您可以将您的存储库注入(inject) Bloc
代码片段
class LoginForm extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider<LoginFormBloc>(
      builder: (context) =>
          LoginFormBloc(RepositoryProvider.of<UserRepository>(context)),
      child: Builder(
        builder: (context) {
          final formBloc = BlocProvider.of<LoginFormBloc>(context);

          return Scaffold(
            appBar: AppBar(title: Text('Simple login')),
            body: FormBlocListener<LoginFormBloc, String, String>(
              onSubmitting: (context, state) => LoadingDialog.show(context),
              onSuccess: (context, state) {
                LoadingDialog.hide(context);
                Navigator.of(context).pushReplacementNamed('success');
              },
              onFailure: (context, state) {
                LoadingDialog.hide(context);
                Notifications.showSnackBarWithError(
                    context, state.failureResponse);
              },

可以引用https://flutterawesome.com/create-beautiful-forms-in-flutter/

官方示例https://bloclibrary.dev/#/architecture
bloc 层可以依赖一个或多个存储库来检索构建应用程序状态所需的数据。
class Repository {
    final DataProviderA dataProviderA;
    final DataProviderB dataProviderB;

    Future<Data> getAllDataThatMeetsRequirements() async {
        final RawDataA dataSetA = await dataProviderA.readData();
        final RawDataB dataSetB = await dataProviderB.readData();

        final Data filteredData = _filterData(dataSetA, dataSetB);
        return filteredData;
    }
}

class BusinessLogicComponent extends Bloc<MyEvent, MyState> {
    final Repository repository;

    Stream mapEventToState(event) async* {
        if (event is AppStarted) {
            try {
                final data = await repository.getAllDataThatMeetsRequirements();
                yield Success(data);
            } catch (error) {
                yield Failure(error);
            }
        }
    }
}

关于flutter_block : BlockProvider vs. RepositoryProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59598151/

相关文章:

dart - 通过参数传递要在函数内修改的变量

flutter - 在flutter中使用 `Draggable`时如何设置反馈和指针之间的偏移量?

flutter - 具有可重启变压器的 block 并发不会取消先前的事件

FlutterBloc 对 Blocs 的初始状态使用react

bloc 的 flutter bloc 最佳实践

dart - 使用自定义名称重用自定义颜色

dart - 如何在 Dart/Flutter 中从它自己的回调 (onPressed) 中访问 Widget

dart - 如何自动缩小文本小部件中的字体以适应最大行数?

flutter - block 更新后无法使用 block 观察者

flutter - 如何在ChangeNotifier提供者Flutter中关闭函数