Reputation: 2972
I am trying to check the login of the user. But, checklogin() even on returning null doesn't equate to null in the if condition.
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
if(checkLogin() == null) {
return Login();
} else {
return Dashboard();
}
}
Future<String> checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key);
print(value);
return value;
}
}
Upvotes: 0
Views: 751
Reputation: 1058
The issue is checkLogin
function is async and return Future for which you'll have wait and you wait in build directly.
So, here is a better and correct implementation. ``
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool isLogin = false;
@override
void initState() {
checkLogin();
super.initState();
}
checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key) ?? false;
setState(() {isLogin = value;});
}
@override
Widget build(BuildContext context) {
return isLogin ? Login() : Dashboard();
}
}
``
Upvotes: 0
Reputation: 3393
I just used a future builder which manages the data returned from future through AsyncSnapshot.
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: checkLogin(),
builder: (BuildContext context, AsyncSnapshot snapshot){
if (snapshot.hasData){
var value = snapshot.data;
if(value == null){
return Login();
}else{
return Dashboard();
}
}else return Dashboard();
}
);
}
Future<String> checkLogin() async {
var prefs = await SharedPreferences.getInstance();
var key = 'Token';
var value = prefs.getString(key);
print(value);
return value;
}
}
Upvotes: 2