有啥方法可以用 Provider 在 Flutter 中全局登录学生吗?

Posted

技术标签:

【中文标题】有啥方法可以用 Provider 在 Flutter 中全局登录学生吗?【英文标题】:Are there any methods toglobally login student in Flutter with Provider?有什么方法可以用 Provider 在 Flutter 中全局登录学生吗? 【发布时间】:2020-09-23 13:40:35 【问题描述】:

我有一个与我的 API 连接的应用程序,每当我登录时,令牌都会存储到 Shared Preferences,并且可以进一步自动登录。每当应用程序重新加载时,我都会使用存储在 SharedPrefs 中的令牌登录,但是当主屏幕加载时,我请求获取从我的 API "api/me" 它将存储的令牌发送到服务器,它返回给我带有该令牌的用户。但我还实现了深色主题切换器,它的值在 SharedPrefs 中的 truefalse 之间切换。我在应用程序抽屉中显示的数据(如用户名和照片)突然消失了,但是当我再次进入主屏幕(应用程序向服务器发送请求)时,它又开始工作了。

如何从数据库中获取值并存储它,保持从每个小部件的访问。我正在使用提供程序。

代码如下:

String token;

Future<Student> setStudent() async 

    try

    final url = "https://myapi/me";
    Response res = await post(Uri.encodeFull(url), body:'token': token);

    json.decode(res.body);

     catch (e)
      print(e);
    

    notifyListeners();

  

我在主屏幕中使用它:

@override
  void didChangeDependencies() 
    if (_isInit) 
      setState(() 
        _isLoading = true;
      );
      Provider.of<StudentData>(context).setStudent().then((std) 
        setState(() 
          _isLoading = false;
          student = std;
        );
      );
    
    _isInit = false;
    super.didChangeDependencies();
  

【问题讨论】:

【参考方案1】:

您可以创建 ChangeNotifier 来存储有关应用程序全局状态的详细信息,如下所述:暗模式、api 令牌等。您可以使用 ChaneNotifierProvider 在 main 方法中的应用程序小部件上方的应用程序级别注入它。

现在,您最初需要将用户的登录状态保存在共享首选项中,因为提供程序仅在运行时才会存在于应用程序范围内。

因此,一旦应用加载,只需根据共享首选项更新 ChangeNotifier(只需一次),更改就会每次都得到反映,并且可以在应用中的任何位置使用

【讨论】:

以上是关于有啥方法可以用 Provider 在 Flutter 中全局登录学生吗?的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2-7 中的 PROVIDER、INJECTOR 和 SERVICE 有啥区别?

Flutter 中的 Bloc Provider 和 Normal Provider 有啥区别?

flutte的第一个hello world程序

Android 的 Fused Location Provider 的 LocationRequest 优先级有啥区别?

使用 Location Manager 和 Fused Location Provider Api 获取位置有啥区别?

Flutter获取packageName和versionCode