首页 > 解决方案 > 如何使用提供程序在应用程序启动时加载状态

问题描述

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

我将使用身份验证状态来决定用户应该看到登录屏幕还是仪表板屏幕

标签: flutter

解决方案


这是我开始颤振时使用的代码的一部分,根据需要实现其余功能。

主要.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;
  }

推荐阅读