【发布时间】:2021-06-26 00:34:16
【问题描述】:
我是 Flutter 和 firebase 开发的新手,所以我真的不知道在我需要它们的每个屏幕中继续从 firebase 获取用户数据需要花费多少,所以我决定获取它们一次并存储它们在 MyUser 类中的静态变量如下:
在MyApp 类中:
bool isAuthenticated = false;
Future checkAuthenticity() async {
AuthService.getCurrentUser().then((user) async {
if (user != null) {
String myUid = await AuthService.getCurrentUID();
await MyUserController().getCurrentUserFromFirebase(myUid);
if (mounted)
setState(() {
isAuthenticated = true;
});
} else {
if (mounted)
setState(() {
isAuthenticated = false;
});
}
});
}
@override
Widget build(BuildContext context) {
home: isAuthenticated ? Home(passedSelectedIndex: 0) : Register(),
}
从上面的代码来看,await MyUserController().getCurrentUserFromFirebase(myUid);这一行如下:
getCurrentUserFromFirebase(String uid) async {
await FirestoreService().getCurrentUserData(uid);
}
从上面的代码来看,await FirestoreService().getCurrentUserData(uid);这一行如下:
Future getCurrentUserData(String uid) async {
try {
var userData = await FirebaseFirestore.instance.collection('users').doc(uid).get();
MyUser.fromData(userData.data());
} catch (e) {
if (e is PlatformException) {
return e.message;
}
return e.toString();
}
}
从上面的代码中,MyUser.fromData(userData.data()); 这一行是一个构造函数
MyUser类如下:
class MyUser {
static String uid;
static String name;
static String username;
static String email;
static String userAvatarUrl;
static String location;
static String phoneNumber;
MyUser.fromData(Map<String, dynamic> data) {
uid = data['id'];
name = data['name'];
username = data['username'];
email = data['email'];
userAvatarUrl = data['userAvatarUrl'];
location = data['location'];
phoneNumber = data['phoneNumber'];
}
}
并利用以下所有内容,在我需要加载当前用户数据的每个页面中,我使用例如:
var userId = MyUser.uid
或显示我使用的当前用户名Text('${MyUser.name}');
当我完全关闭应用程序并重新启动它时,它应该检查真实性,并完成执行main() 函数中的其余代码。
所以我的问题是:
1) 这在我们发布应用时是否存在任何性能问题?
2) 这真的会阻止我在需要数据的每个页面中消耗的不必要的读取吗?
3) 有没有更好的方法来防止从 firebase 进行不必要的读取,例如将当前用户数据保存为字符串和本地个人资料图片?
请原谅我延长了这个问题,但我想分享代码本身。
任何帮助将不胜感激。
【问题讨论】:
标签: firebase flutter dart google-cloud-firestore