dart - 使用通用 bloc 提供程序时 bloc 不会被初始化

标签 dart flutter

这是 Bloc (简体):

import 'package:autobleidas_flutter/bloc/bloc_base.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:rxdart/rxdart.dart';

class LoginBloc extends BlocBase {
  final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;

  final PublishSubject<bool> loggedIn = PublishSubject<bool>();
  final PublishSubject<bool> loading = PublishSubject<bool>();

}

这是区 block 提供者:

class BlocProvider<T> extends InheritedWidget {
  final T bloc;

  BlocProvider({Key key, Widget child, this.bloc})
      : super(key: key, child: child);

  static T of<T extends BlocBase>(BuildContext context) {
    final type = _typeOf<BlocProvider<T>>();
    return (context.inheritFromWidgetOfExactType(type) as BlocProvider).bloc;
  }

  static Type _typeOf<T>() => T;

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) {
    return true;
  }
}

但是,在 LoginScreen 中,我无法访问 Bloc 的 loggedIn Subject。以下是从 main 打开 LoginScreen 并将 bloc 传递给它的方式:

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: GlobalMaterialLocalizations.delegates,
      supportedLocales: allTranslations.supportedLocales(),
      home: BlocProvider<LoginBloc>(child: LoginScreen()), // <-------- HERE
    );
  }
}

这是我尝试在 LoginScreen 中访问它的方式:

class _LoginScreenState extends State<LoginScreen> {
  bool _isLoading = false;

  @override
  void didChangeDependencies() {
    LoginBloc bloc = BlocProvider.of<LoginBloc>(context);

    bloc.loggedIn.listen((isLoggedIn) => Navigator.of(context).push(
        MaterialPageRoute(
            builder: (BuildContext context) => RegistrationScreen())));

    bloc.loading.listen((state) => setState(() => _isLoading = state));
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
     return Container();
  }

错误:

The getter 'loggedIn' was called on null.

那么为什么 bloc 是空的?我该如何解决这个问题?

最佳答案

在这一行中,BlocProvder 期望一个 bloc。

home: BlocProvider<LoginBloc>(child: LoginScreen()),

你不是在这里传递你的 Bloc 。

像下面这样传递:

home: BlocProvider<LoginBloc>(child: LoginScreen(),bloc: LoginBloc()),

BlocProvider<LoginBloc>意味着您定义了您将要通过的 Bloc 类型。

关于dart - 使用通用 bloc 提供程序时 bloc 不会被初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55916613/

相关文章:

unit-testing - 如何使用 pub run test 运行特定的 Dart _test 文件?

android - 在Flutter中的for循环中使用时如何更改OnTap函数中的值

flutter - flutter 中的每日重复通知

dart - 使用Angular Dart使用WebSockets/服务器发送事件

dart - 先前添加的流值以返回监听(广播流)

flutter - 如何实现自行车轮滚动列表小部件

flutter - 带有 Cupertino UI 的 Material Datepicker

firebase - 与 firebase 查询具有多重关系的 Flutter Bloc

android - Flutter应用程序无法在真实设备或仿真器上运行

android - 使用ListTile并获取异常:未布局RenderBox