flutter - 如何使用提供程序在应用程序启动时加载状态
问题描述
我在 Flutter 中使用 Provider 进行应用程序状态管理,身份验证数据存储在共享首选项中,我想在应用程序启动时使用提供程序加载它,最好的方法是什么。
我将使用身份验证状态来决定用户应该看到登录屏幕还是仪表板屏幕
解决方案
这是我开始颤振时使用的代码的一部分,根据需要实现其余功能。
主要.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import './providers/authentication.dart';
MultiProvider(
providers: [
ChangeNotifierProvider(
create: (_) => Authentication(),
),
],
child: Consumer<Authentication>(
builder: (ctx, auth, _) => MaterialApp(
title: 'MyApp',
home: auth.isAuthorized
? MyScreen()
: FutureBuilder(
future: auth.tryLogin(),
builder: (ctx, authResultSnapshot) =>
authResultSnapshot.connectionState ==
ConnectionState.waiting
? SplashScreen()
: AuthScreen(),
),
身份验证.dart
String _token;
DateTime _expiryDate;
String _userId;
bool get isAuthorized {
// that is a very simple check
return token != null;
}
Future<bool> tryLogin() async {
final prefs = await SharedPreferences.getInstance();
if (!prefs.containsKey('userData')) {
return false;
}
final extractedUserData = json.decode(prefs.getString('userData')) as Map<String, Object>;
final expiryDate = DateTime.parse(extractedUserData['expiryDate']);
if (expiryDate.isBefore(DateTime.now())) {
return false;
}
_token = extractedUserData['token'];
_userId = extractedUserData['userId'];
_expiryDate = expiryDate;
notifyListeners();
return true;
}
推荐阅读
- arrays - 如何计算 MATLAB 中数组的特定值?
- javascript - Puppeteer cors 错误
- c# - 从 C# 中的另一个表单访问文本框 - 请注意,我要为其设置框的表单是第一个表单
- c# - 鼠标事件未在 Windows WPF 中触发
- jsp - 如何使用超链接将数据发送到 servlet
- ios - 更改框架时视图重新加载
- c++ - char* 与 uint8_t 的字符串比较
- java - 本地文件是否在更新后仍然存在?(LibGDX)
- php - 我想在多行中插入多个帖子值
- java - How does the AudioInputStream.read(byte[] b) function work?