问题描述
我有以下应用,其中我使用FirebaseUser
提供了MultiProvider
的流。
void main() => runApp(App());
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
StreamProvider<Position>(
create: (_) => LocationService().location,),StreamProvider<FirebaseUser>(
create: (_) => AuthenticationService().user,],child: MaterialApp(
debugShowCheckedModeBanner: false,title: "title",theme: ThemeData(
primarySwatch: Colors.indigo,accentColor: Colors.indigoAccent,home: HomeScreen(),);
}
}
流的生成如下:
class AuthenticationService {
Stream<FirebaseUser> get user {
return FirebaseAuth.instance.onAuthStateChanged;
}
}
当用户使用Firebase
登录并在HomeScreen
中访问流时,我第一次获得的值为null
。从第二次开始,它运行良好。
class HomeScreenState extends State<HomeScreen> {
FirebaseUser u;
@override
void initState() {
u = Provider.of<FirebaseUser>(context,listen: false);
print(u);
super.initState();
}
}
如何确保Provider.of
返回一个有效值(即,仅当用户实际上未登录时才返回null
,而在登录时返回一个non-null
值)或某个值undefined
值的种类(如果尚不知道)?
解决方法
在使用multiprovider和Provider.of<FirebaseUser>().
时,我也遇到了类似的问题
首次provider.of返回null,然后如果用户已登录,则返回有效用户。
作为一种解决方法,我在下面做
@override
void initState() {
_initialiseFirebase();
super.initState();
}
Future _initialiseFirebase() async {
try {
await Firebase.initializeApp();
sub = FirebaseAuth.instance.authStateChanges().listen((user) {
// listener is called on registered. So we need to skip calling viewmodel for first time.
if (_authListenerRegistered) _viewmodel.verifyAuth(user);
_authListenerRegistered = true;
});
} catch (e) {
setState(() {
_error = true;
});
}
}