使用通用集团提供程序时,bloc不会被初始化

问题描述 投票:0回答:1

这是集团(简化):

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>();

}

这是集团提供者:

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中,我无法访问集团的loggedIn主题。以下是从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
    );
  }
}

以下是我尝试在登录屏幕中访问它的方法:

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();
  }

错误:

getter'loginIn'在null上调用。

那么为什么集团无效呢?我该如何解决?

dart flutter
1个回答
1
投票

在这一行中,BlocProvder期待一个集团。

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

你没有在这里通过你的集团。

传递方式如下:

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

BlocProvider<LoginBloc>意味着你定义一个你要通过的集团类型。

© www.soinside.com 2019 - 2024. All rights reserved.