Flutter how to use Future return value as if variable

后端 未结 5 983
离开以前
离开以前 2021-02-18 23:50

I want to get Future return value and use it like variable. I have this Future function

  Future _fetchUserInfo(String id)          


        
5条回答
  •  囚心锁ツ
    2021-02-19 00:47

    To add a little more detail on the original question from Daibaku which might help clarify using Futures in Flutter/dart, user was:

    final user = _fetchUserInfo(id);
    

    Without letting compiler infer type, that would be:

    final Future user = _fetchUserInfo(id);
    

    Get & Use a Future Value

    Daibaku asked how to get the return value of user & use it.

    To use user in a Widget, your widget must watch/observe for changes, and rebuild itself when it does.

    You can do this manually with a lot of boilerplate code, or you could use FutureBuilder, which has done this for you:

      FutureBuilder(future: user, builder: (context, snapshot) 
      {
        if (snapshot.hasData) return Text(snapshot.data.userName);
        return Container(width: 0.0, height: 0.0,);
      }
    

    More explicitly, you could write the above as:

      FutureBuilder(future: user, builder: (context, AsyncSnapshot userSnapshot)
      {
        if (userSnapshot.hasData) return Text(userSnapshot.data.userName);
        return Container(width: 0.0, height: 0.0,);
      }
    

    FutureBuilder in the above example, synchronously (i.e. immediately) returns a zero width/height Container Widget, but also attaches an observer to your future user, to know when Future data arrives.

    When user is eventually updated with "data", FutureBuilder's observer is notified and it calls setState(), which starts a rebuild of itself. Now that snapshot.hasData is true, Text(snapshot.data.userName) is returned instead of the empty Container.


    If you weren't using user within the synchronous world of Widget Element tree building and just wanted to print out the value for debugging you could attach an observer using then:

    user.then((u) => print(u.userName));
    

提交回复
热议问题