Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何使用提供程序在应用程序启动时加载状态_Flutter - Fatal编程技术网

Flutter 如何使用提供程序在应用程序启动时加载状态

Flutter 如何使用提供程序在应用程序启动时加载状态,flutter,Flutter,我在Flatter中使用Provider进行应用程序状态管理,身份验证数据存储在共享首选项中,我想在应用程序启动时使用Provider加载它,最好的方法是什么 我将使用auth status来决定用户应该看到登录屏幕还是仪表板屏幕,如下所示: Future main()异步{ final appState=等待loadAppStateFromSharedData(); runApp( 提供者价值( 值:appState, 子项:MyApp(), ), ); } 试试这个 class MyApp

我在Flatter中使用Provider进行应用程序状态管理,身份验证数据存储在共享首选项中,我想在应用程序启动时使用Provider加载它,最好的方法是什么

我将使用auth status来决定用户应该看到登录屏幕还是仪表板屏幕,如下所示:

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;
}