Flutter + SharedPreferences:如何使用 FutureBuilder [英] Flutter + SharedPreferences: how to use FutureBuilder

查看:83
本文介绍了Flutter + SharedPreferences:如何使用 FutureBuilder的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to build a Wrapper() widget that return either the LoginScreen or the HomeScreen() based on 3 different factors:

  1. 用户是否为空
  2. 电子邮件是否通过验证
  3. 如果应用程序是第一次启动与否

我遇到的问题是 FutureBuilder 不会触发 Future...

The problem I have is that the Future doesn't get triggered by the FutureBuilder...

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

How can I solve this ? Ty

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:

You need to assign the method hasAlreadyStarted to the property 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆