Flutter 如何使用提供程序在应用程序启动时加载状态
我在Flatter中使用Provider进行应用程序状态管理,身份验证数据存储在共享首选项中,我想在应用程序启动时使用Provider加载它,最好的方法是什么 我将使用auth status来决定用户应该看到登录屏幕还是仪表板屏幕,如下所示:Flutter 如何使用提供程序在应用程序启动时加载状态,flutter,Flutter,我在Flatter中使用Provider进行应用程序状态管理,身份验证数据存储在共享首选项中,我想在应用程序启动时使用Provider加载它,最好的方法是什么 我将使用auth status来决定用户应该看到登录屏幕还是仪表板屏幕,如下所示: Future main()异步{ final appState=等待loadAppStateFromSharedData(); runApp( 提供者价值( 值:appState, 子项:MyApp(), ), ); } 试试这个 class MyApp
Future main()异步{
final appState=等待loadAppStateFromSharedData();
runApp(
提供者价值(
值:appState,
子项:MyApp(),
),
);
}
试试这个class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Consumer<Auth>(
builder: (ctx, auth, _) => MaterialApp(
title: 'AppName',
home: auth.isAuth
? DashboardScreen()
: AuthScreen(),
),
),
};
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
退货消费者(
建筑商:(ctx,认证,)=>MaterialApp(
标题:“AppName”,
首页:auth.isAuth
?仪表板屏幕()
:AuthScreen(),
),
),
};
}
这是我在启动颤振时使用的代码的一部分,请按照您的意愿实现其余功能
主飞镖
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(),
),
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
导入“./providers/authentication.dart”;
多供应商(
供应商:[
变更通知提供者(
创建:()=>Authentication(),
),
],
儿童:消费者(
建筑商:(ctx,认证,)=>MaterialApp(
标题:“MyApp”,
主页:auth.isAuthorized
?我的屏幕()
:未来建设者(
future:auth.tryLogin(),
生成器:(ctx、authResultSnapshot)=>
authResultSnapshot.connectionState==
连接状态等待
?防溅屏()
: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;
}
String\u令牌;
日期时间_expiryDate;
字符串_userId;
布尔被授权了{
//这是一张非常简单的支票
返回令牌!=null;
}
Future tryLogin()异步{
final prefs=wait SharedPreferences.getInstance();
如果(!prefs.containsKey('userData')){
返回false;
}
final extractedUserData=json.decode(prefs.getString('userData'))作为映射;
final expireydate=DateTime.parse(extractedUserData['expireydate']);
if(expireydate.isBefore(DateTime.now()){
返回false;
}
_token=extractedUserData['token'];
_userId=extractedUserData['userId'];
_expiryDate=expiryDate;
notifyListeners();
返回true;
}