Flutter + SharedPreferences:如何使用 FutureBuilder

Flutter + SharedPreferences: how to use FutureBuilder

我正在尝试构建一个 Wrapper() 小部件,该小部件 return LoginScreen 或 HomeScreen() 基于 3 个不同的因素:

  1. 用户是否为空
  2. 邮箱是否通过验证
  3. 如果应用程序是第一次启动或未启动

我遇到的问题是 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;
    }
  }
}

您需要将方法 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