1. ホーム
  2. flutter

Flutterで "build "関数が完了したことを伝えるコールバックはありますか?

2023-10-05 01:39:52

質問

画面内にlistViewがあります。私はそれにコントローラを添付しました。私は私のエンドポイントを呼び出すことができ、応答を受け取り、それをパースし、行に挿入します。ListViewは自動的にスクロールするはずです。それはそうする、しかし、完全な方法でない。私は常に1つのアイテムが遅れています。これは私のコードです。

@override
  Widget build(BuildContext context) {
    // Scroll to the most recent item
    if (equationList.length > 0) {
      _toEnd();
    }

    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: EquList(equationList, _scrollController),
      floatingActionButton: new FloatingActionButton(
        onPressed: onFabClick,
        tooltip: 'Fetch Post',
        child: new Icon(isLoading ? Icons.pause : Icons.play_arrow),
      ),
    );
  }

  void _toEnd() {
    _scrollController.animateTo(
      _scrollController.position.maxScrollExtent,
      duration: const Duration(milliseconds: 250),
      curve: Curves.ease,
    );
  }

問題なのは、私が呼んでいる _toEnd() 関数を呼び出していることです。そこで、次のようなコールバックを探しています(もしあれば)。 build() が完了したことを教えてくれるコールバックを探しています。それから、私は自分の _toEnd() 関数を呼び出します。

この場合のベストプラクティスは何でしょうか?

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

一般的な解決方法

物事をはっきりさせるために、私はこの質問がこれほど注目を集めるとは思っていませんでした。したがって、私はこの非常に特殊なケースについてだけ答えました。

というのも は別の回答で説明したように WidgetsBinding を追加する方法を提供します。 一度だけ ポストフレーム コールバック .

WidgetsBinding.instance.addPostFrameCallback((_) {
  // executes after build
})

このコールバックは は一度だけ呼び出されます。 であるため、ビルドするたびに追加する必要があります。

@override
Widget build(BuildContext context) {
  WidgetsBinding.instance.addPostFrameCallback((_) => afterBuild);
  return Container(); // widget tree
}

void afterBuild() {
  // executes after build is done
}

特定(非同期)

を詳しく説明する Günter の のコメントです。

@override
Widget build(BuildContext context) {
  executeAfterBuild();
  return Container();
}

Future<void> executeAfterBuild() async {
  // this code will get executed after the build method
  // because of the way async functions are scheduled
}

いい例があります。 があります。 があります。 .

に関する豊富な情報 でのスケジューリング は、ここで見つけることができます。 .