firebase - Flutter + SharedPreferences:如何使用FutureBuilder

标签 firebase flutter dart firebase-authentication sharedpreferences

我正在尝试构建一个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;
        }
      }
    }

    最佳答案

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

    关于firebase - Flutter + SharedPreferences:如何使用FutureBuilder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64149683/

    相关文章:

    dart - 如何用导出重命名类?

    javascript - 云函数 - 更新 onUpdate 触发器内的文档变量。可能的?

    ios - 检查用户 ID(Firebase 和 Swift)

    dart - 是否可以循环使用 flutter 卡片?

    angularjs - ts2dart 会继续维护吗?

    flutter - 在 Release模式下运行时使用 SyncFusion 的 Flutter 应用程序出现 PlatformException 序列化程序错误

    java - 从 Firebase 加载大型 json 时,Android 应用程序返回 java.lang.OutOfMemoryError

    firebase - 在 Flutter 中打开推送通知时使用 Navigator

    flutter - 在 `buildMenuItem()` 小部件中实现 Flutter 图标

    firebase - 使用 Dart .sort() 函数对 AsyncSnapshot<QuerySnapshot<Object?>> 中的 Firebase 数据进行排序