如何在提供方中使用飞镖播放流

时间:2019-08-04 06:46:11

标签: firebase flutter dart google-cloud-firestore stream

这最初是可行的,只是停止了,我无法弄清楚问题出在哪里。

我正在使用提供程序包中的flutter项目处理流。从服务文件中发出流,并且在小部件文件上进行监听。 Firebase onAuthStateChanged流正在运行,但我的无法运行。

我的文件中有很多代码,因此不会在此处发布所有内容。

我对AuthStatus流有问题 我尝试在小部件类上订阅流,但似乎没有流被发出

  MyApp(){
    auth.authStateStream.listen((d){print("$d is data");});
  }

这是如何从服务文件中使用Firebase流的

  Stream<UserModel> get onAuthStateChanged{
      return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
  }

我对AuthStatus流有问题。最初是在工作 这就是从服务文件中发射AuthStatus流的方式

  //Services file
  final StreamController<AuthStatus> _currentAuthStateController =
      StreamController<AuthStatus>.broadcast();

  Stream<AuthStatus> get authStateStream{
    return _currentAuthStateController.stream;
  }


  void testStremas() {
    //Stoast.setMessage("Test Message");
    _currentAuthStateController.add(AuthStatus.ACTIVE);
  }

这是提供者作为MaterialAPP小部件的父项来简化流的方式

class MyApp extends StatelessWidget {
  //I was trying if i my widget could subscribe to the stream
  MyApp (){
    auth.authStateStream.listen((d){print("$d is data");});
  }
  final ToastHelper toast = ToastHelper();

  final ThemeHelper theme = ThemeHelper();

  final AuthService auth = AuthService();

  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        StreamProvider<UserModel>.value(value: auth.onAuthStateChanged),
        StreamProvider<ToastMessage>.value(value: toast.onNewMessage),
        StreamProvider<AuthStatus>.value(
            value: auth.authStateStream, initialData: AuthStatus.NONE),
      ],
      child: MaterialApp(
        title: Strings.appName,
        theme: theme.darkThemeData(),
        home: Loader(),
        routes: {
          'home': (context) => Home(),
        },
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}

这是通过单击按钮在小部件上调用上述方法的方式

 //Widgets file 
  onTap: () => auth.testStremas(),

预期结果应该是服务文件中的AuthStatus更改时,应通过提供程序包通知小部件。预先感谢

Widget _body(BuildContext context) {
    final AuthStatus _authStatus = Provider.of<AuthStatus>(context);
    return Center(
      child: Container(
        constraints: BoxConstraints(maxWidth: 300),
        child: SingleChildScrollView(
            child: Center(
              child: _authStatus == AuthStatus.ACTIVE
                  ? Padding(
                    padding: const EdgeInsets.all(8.0),
                    child:CircularProgressIndicator(strokeWidth: 2,)
                  )
                  : _buildScreen(context),
            )),
      ),
    );
  }

1 个答案:

答案 0 :(得分:0)

我不确定-尝试更改

B[k,l]

np.complex()

rxdart库https://pub.dev/packages/rxdart中的这个BehaviorSubject,因此,您应该导入它。 BehaviorSubject是保持流的最后状态。您可以在这里https://pub.dev/documentation/rxdart/latest/rx/BehaviorSubject-class.html

了解更多信息
final StreamController<AuthStatus> _currentAuthStateController =
  StreamController<AuthStatus>.broadcast();