1. ホーム
  2. dart

[解決済み] InitStateメソッドで非同期データをロードする方法はありますか?

2022-07-13 03:03:56

質問

InitStateメソッドで非同期データをロードする方法を探しています。私はGoogleAuthコードを使用しており、私はストリームが実行されるまで、ビルドメソッドを実行する必要があります。

私のinitStateメソッドは、次のとおりです。

 @override
  void initState () {
    super.initState();
    _googleSignIn.onCurrentUserChanged.listen((GoogleSignInAccount account)     {
      setState(() {
        _currentUser = account;
      });
    });
    _googleSignIn.signInSilently();
  }

ご意見をお聞かせください。

どのように解決するのですか?

方法1: この場合 ストリームビルダー を使って行います。これを実行すると ビルダー メソッドが実行されます。 ストリーム のデータが変更されるたびに

以下は、私のサンプルプロジェクトの1つからのコードスニペットです。

StreamBuilder<List<Content>> _getContentsList(BuildContext context) {
    final BlocProvider blocProvider = BlocProvider.of(context);
    int page = 1;
    return StreamBuilder<List<Content>>(
        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(),
            );
          }
        });
  }

上記のコードで ストリームビルダー はコンテンツの変化を監視し、最初は空の配列を表示し、次に 円形進行状況インジケータ . 一旦APIコールをすると、取得したデータはコンテンツ配列に追加され、その配列はループを実行します。 ビルダー メソッドが実行されます。

ユーザーが下にスクロールすると、さらに多くのコンテンツが取得され、コンテンツ配列に追加され、再び ビルダー メソッドが実行されます。

あなたのケースでは、最初の読み込みだけが必要です。しかし、これはデータが取得されるまでの間、画面に何か他のものを表示するオプションを提供します。

これが役に立つことを願っています。

EDITです。

あなたの場合、以下のような感じになるかと思います。

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

方法2: 別の方法として async メソッドを作成し、それを initState() メソッドを呼び出します。

 @override
  void initState() {
    super.initState();
    asyncMethod();
  }

  void asyncMethod() async {
    await asyncCall1();
    await asyncCall2();
    // ....
  }