Flutter + SharedPreferences:如何使用 FutureBuilder

Posted

技术标签:

【中文标题】Flutter + SharedPreferences:如何使用 FutureBuilder【英文标题】:Flutter + SharedPreferences: how to use FutureBuilder 【发布时间】:2021-01-16 20:09:51 【问题描述】:

我正在尝试构建一个 Wrapper() 小部件,它根据 3 个不同的因素返回 LoginScreen 或 HomeScreen():

    用户是否为空 电子邮件是否经过验证 应用是否在首次启动

我遇到的问题是 Future 没有被 FutureBuilder 触发...

我该如何解决这个问题?类型

import 'package:client/providers/auth_provider.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../screens/home_screen.dart';
import '../screens/login_screen.dart';

class Wrapper extends StatefulWidget 
  @override
  _WrapperState createState() => _WrapperState();


class _WrapperState extends State<Wrapper> 
  FirebaseAuth auth = FirebaseAuth.instance;

  @override
  void initState() 
    super.initState();
  

  @override
  Widget build(BuildContext context) 
    return FutureBuilder(builder: (context, snapshot) 
      if (snapshot.data == true) 
        return Provider.of<User>(context) != null &&
                snapshot.hasData == true &&
                AuthProvider().isEmailVerified
            ? HomeScreen()
            : LoginScreen();
       else 
        return LoginScreen();
      
    );
  

  Future<bool> hasAlreadyStarted() async 
    try 
      SharedPreferences prefs = await SharedPreferences.getInstance();
      if (prefs.getBool("first_run") == null ||
          prefs.getBool("first_run") == true) 
        print(prefs.getBool("first_run"));
        prefs.setBool("first_run", false);
        return false;
       else 
        print(prefs.getBool("first_run"));
        return true;
      
     catch (error) 
      print("error");
      return false;
    
  

【问题讨论】:

【参考方案1】:

您需要将方法hasAlreadyStarted 分配给属性future

return FutureBuilder(future: hasAlreadyStarted(),
   builder: (context, snapshot) 
      if (snapshot.data == true) 
        return Provider.of<User>(context) != null &&
                snapshot.hasData == true &&
                AuthProvider().isEmailVerified
            ? HomeScreen()
            : LoginScreen();
       else 
        return LoginScreen();
      
    );

检查:

https://api.flutter.dev/flutter/widgets/FutureBuilder-class.html

【讨论】:

以上是关于Flutter + SharedPreferences:如何使用 FutureBuilder的主要内容,如果未能解决你的问题,请参考以下文章

SharedPreferences.Editor 的apply()与commit()方法的区别

Android SharedPreferences源码分析

Android SharedPreferences源码分析

开发android app有啥架构吗

Xcode 13 和 Flutter 2.5.1 - 致命错误:找不到“Flutter/Flutter.h”文件 #import <Flutter/Flutter.h>

Flutter 致命错误:找不到“Flutter/Flutter.h”文件