Dart中getUID函数结果校验的简写方式是什么?
问题解答
1. 函数的简写实现
你的getUID()函数可以直接简化成一行,利用Dart的空安全特性就能搞定:
String getUID() => FirebaseAuth.instance.currentUser?.uid ?? '';
具体说明:
FirebaseAuth.instance.currentUser?.uid:用?.空安全访问符,要是currentUser为null,整个表达式直接返回null;如果用户已登录,直接取uid即可——uid本身就是字符串类型,完全没必要额外调用toString()?? '':空合并操作符,当左侧表达式为null时,自动返回右侧的空字符串,完美替代原函数里的if-else判断逻辑
2. 避免多次Firestore查询的方案
先明确:你的getUID()本身只是读取Firebase Auth本地缓存的用户ID,不会触发Firestore查询。但如果后续你用这个UID去查询Firestore的用户文档,要避免重复请求,可以在InheritedWidget的状态类里加个缓存机制:
具体做法:
- 在状态类中维护一个变量,专门缓存已经查询到的Firestore用户文档
- 封装一个获取用户文档的方法,先检查缓存:如果缓存存在直接返回,不存在再发起Firestore请求
- 当用户登录状态变更(比如登出换账号)时,清空缓存,保证获取到最新的用户数据
示例代码:
class AppStateContainer extends StatefulWidget { final Widget child; const AppStateContainer({super.key, required this.child}); static AppStateContainerState of(BuildContext context) { return context.dependOnInheritedWidgetOfExactType<_InheritedAppState>()!.data; } @override AppStateContainerState createState() => AppStateContainerState(); } class AppStateContainerState extends State<AppStateContainer> { // 用getter进一步简化UID获取逻辑 String get uid => FirebaseAuth.instance.currentUser?.uid ?? ''; // 缓存Firestore用户文档 DocumentSnapshot? _cachedUserDoc; // 获取用户文档(带缓存逻辑) Future<DocumentSnapshot?> getUserDocument() async { // 缓存存在则直接返回 if (_cachedUserDoc != null) return _cachedUserDoc; // UID为空时直接返回null if (uid.isEmpty) return null; // 无缓存时发起Firestore查询,并将结果存入缓存 final userDoc = await FirebaseFirestore.instance.collection('users').doc(uid).get(); setState(() { _cachedUserDoc = userDoc; }); return userDoc; } // 登录状态变更时调用,清空缓存 void clearUserDocCache() { setState(() { _cachedUserDoc = null; }); } @override Widget build(BuildContext context) { return _InheritedAppState( data: this, child: widget.child, ); } } class _InheritedAppState extends InheritedWidget { final AppStateContainerState data; const _InheritedAppState({super.key, required this.data, required super.child}); @override bool updateShouldNotify(_InheritedAppState oldWidget) { // 当缓存的用户文档变化时,通知依赖的组件更新 return data._cachedUserDoc != oldWidget.data._cachedUserDoc; } }
使用方式:
在应用任意位置获取用户文档时,直接调用带缓存的方法即可:
final userDoc = await AppStateContainer.of(context).getUserDocument();
这样无论调用多少次,只有第一次会发起Firestore请求,后续都会直接返回缓存结果,避免重复查询。
内容的提问来源于stack exchange,提问作者whatwhatwhat
相关产品推荐
相关产品推荐

