Is there a way to load async data on InitState method?

前端 未结 9 1508
你的背包
你的背包 2020-12-05 16:39

I\'m a looking for a way to load async data on InitState method, I need some data before build method runs. I\'m using a GoogleAuth code, and I need to execute build method

9条回答
  •  有刺的猬
    2020-12-05 17:42

    You can use StreamBuilder to do this. This will run the builder method whenever the data in stream changes.

    Below is a code snippet from one of my sample projects:

    StreamBuilder> _getContentsList(BuildContext context) {
        final BlocProvider blocProvider = BlocProvider.of(context);
        int page = 1;
        return StreamBuilder>(
            stream: blocProvider.contentBloc.contents,
            initialData: [],
            builder: (context, snapshot) {
              if (snapshot.data.isNotEmpty) {
                return ListView.builder(itemBuilder: (context, index) {
                  if (index < snapshot.data.length) {
                    return ContentBox(content: snapshot.data.elementAt(index));
                  } else if (index / 5 == page) {
                    page++;
                    blocProvider.contentBloc.index.add(index);
                  }
                });
              } else {
                return Center(
                  child: CircularProgressIndicator(),
                );
              }
            });
      }
    

    In the above code StreamBuilder listens for any change in contents, initially its an empty array and shows the CircularProgressIndicator. Once I make API call the data fetched is added to contents array, which will run the builder method.

    When the user scrolls down, more content is fetched and added to contents array which will again run builder method.

    In your case only initial loading will be required. But this provides you an option to display something else on the screen till the data is fetched.

    Hope this is helpful.

    EDIT:

    In your case I am guessing it will look something like shown below:

    StreamBuilder>(
            stream: account, // stream data to listen for change
            builder: (context, snapshot) {
                if(account != null) {
                    return _googleSignIn.signInSilently();
                } else {
                    // show loader or animation
                }
            });
    

提交回复
热议问题