[英]Flutter + SharedPreferences: how to use FutureBuilder
我正在尝试构建一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.