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()方法的区别
Xcode 13 和 Flutter 2.5.1 - 致命错误:找不到“Flutter/Flutter.h”文件 #import <Flutter/Flutter.h>