Value Provider 首次返回 null
Posted
技术标签:
【中文标题】Value Provider 首次返回 null【英文标题】:Value Provider returns null for the first time 【发布时间】:2020-12-11 09:19:28 【问题描述】:我有以下应用程序,我使用MultiProvider
提供FirebaseUser
流。
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
值如果值未知?
【问题讨论】:
如果用户登录,您可以使用共享首选项来存储布尔值。查看pub.dev/packages/shared_preferences 【参考方案1】:我在使用 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;
);
【讨论】:
以上是关于Value Provider 首次返回 null的主要内容,如果未能解决你的问题,请参考以下文章
除了 value 道具之外的任何道具都可以在 Context.Provider 中工作吗
NETWORK_PROVIDER 和 GPS_PROVIDER 在片段中返回 null
为啥在 android 中使用 NETWORK_PROVIDER 时 location.getSpeed() 总是返回 0?