【问题标题】:fetching user data from firebase and storing it in static variables从 firebase 获取用户数据并将其存储在静态变量中
【发布时间】: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


    【解决方案1】:

    作为一个简短的回答, 您可以创建一个 SharedPreferences 类以键:值的方式将数据存储为字符串。 因此,您可以在任何地方获取该类的实例并从应用程序的任何位置访问它。 如果您还声明了一些将字符串解码为 json 的函数,您将获得一个现成的用户类实例以返回您的函数,这将使其更容易。 因此,当您想将用户信息保存到本地存储(SharedPreferences)时,您可以使用一个函数将您的用户对象编码为字符串并将其保存到 SharedPreferences,如下所示..

    user.dart' 作为用户;冲突问题

    class SharedPrefs {
      static SharedPreferences _sharedPrefs;
    
      init() async {
        if (_sharedPrefs == null) {
          _sharedPrefs = await SharedPreferences.getInstance();
        }
      }
    
      dynamic get user=> _sharedPrefs.getString('user')!=null?theUser.User.fromString(_sharedPrefs.getString('user')):null;
      set user(theUser.User user)=> _sharedPrefs.setString('user', jsonEncode(user));
    
      String get accessToken=> _sharedPrefs.getString('access_token');
      set accessToken(String accessToken)=> _sharedPrefs.setString('access_token', accessToken);
     
      void removeString(String entry){
        _sharedPrefs.remove(entry);
      }
    
    }
    
    final sharedPrefs = SharedPrefs();
    

    在应用程序的任何地方,您都可以通过键入 sharedPrefs.user 直接使用它

    【讨论】:

    • 我明白了...谢谢您的回复...所以为此,我需要从云中获取数据并将共享首选项保存为键中的字符串:值对...所以它几乎与我下载数据然后重用它的方法相同......除非这种方法提供的性能比我的更高
    • 其实 sharedpreferences 相当快。特别是如果您不打算存储大数据或关系数据。它还可以让你写得更少,我认为使用起来更灵活。但如果你想保存复杂的数据或一些敏感信息,你可以看看 sqlite、room 和 hive。
    • 好的..感谢您的回答和提供这些建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多