Trishant Pahwa
Trishant Pahwa

Reputation: 2972

Async function in flutter does not return null

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

Answers (2)

Haroon khan
Haroon khan

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

Henok
Henok

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

Related Questions