我正在尝试实现用户登录会话 . 我愿意跳过登录屏幕并愿意导航到主屏幕 . 我创建了两个屏幕并实现了共享首选项来存储用户响应 . 我可以保存并打印回来 . 我在if条件中遇到问题,我试图检查从用户检查函数返回的布尔值,该函数检查已保存的共享首选项值并基于此返回true或false .
{
return new MaterialApp(
home: new Scaffold(
body: ((checkUserAndNavigate(context))== true)
? new HomeScreen()
: new LoginScreen(),
),
}
//Check if user login is saved
Future checkUserAndNavigate(BuildContext context) async
{
bool status;
print("Checking user state");
SharedPreferences preferences = await SharedPreferences.getInstance();
String userdata = preferences.getString("userData");
if (userdata != null) {
status = true;
} else {
status = false;
}
return status;
}
我正在使用三元条件来检查和加载适当的屏幕 . 但它的上述代码中的函数(checkUserAndNavigate(context))== true)总是说下面的错误 "Equality operator '==' invocation with reference of unrelated types"
完整的代码如下
import 'dart:async';
import 'package:flutter/material.dart';
import './app/src/screens/loginscreen.dart';
import './app/src/screens/homescreen.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(new MTrackNotificationsMain());
class MTrackNotificationsMain extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
// This widget is the root of your application
return new MaterialApp(
home: new Scaffold(
body: (checkUserAndNavigate(context) == true)
? new HomeScreen()
: new LoginScreen(),
),
theme: new ThemeData(
primaryColor: Colors.teal.shade400,
primaryColorDark: Colors.teal.shade800,
primarySwatch: Colors.teal,
accentColor: Colors.teal.shade300,
),
//Routes attribute work as screen navigator
routes: {
"/LoginScreen": (BuildContext context) => new LoginScreen(),
'/HomeScreen': (BuildContext context) => new HomeScreen()
},
);
}
}
//Check if user login is saved
Future checkUserAndNavigate(BuildContext context) async {
bool status;
print("Checking user state");
SharedPreferences preferences = await SharedPreferences.getInstance();
String userdata = preferences.getString("userData");
if (userdata != null) {
status = true;
} else {
status = false;
}
return status;
}
2 回答
使用FutureBuilder更容易 . 这个Widget根据Future的结果构建自己 .
考虑一下:
无需操纵Navigator堆栈 .
checkUserAndNavigate
正在返回一个Future,这就是你得到这个错误的原因 . 您可以使用空白加载屏幕/启动画面来读取首选项并从那里导航到正确的屏幕:更改
checkUserAndNavigate
的返回值,您将看到如何加载不同的屏幕 .