繁体   English   中英

Flutter + SharedPreferences:如何使用 FutureBuilder

[英]Flutter + SharedPreferences: how to use FutureBuilder

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

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM