web-dev-qa-db-ja.com

Flutter:複数回呼び出されるStatelessWidget.build

私はいつもここに質問にコードを入れていますが、今回はバグが数千行のコードのどこかにある可能性があるため不可能です。しかしながら:

メイン画面のビルドメソッド(StatelessWidget)はMaterialApp(ホームプロパティ)の子孫であり、デバッグモードでは通常1回、通常では3回呼び出されることに気付きました。リリースモード。

どのような状況下でそのようなことが起こり得ますか?何度も再生を試みましたが失敗しました。

編集:

問題は、メディアクエリから取得した画面サイズをグローバル変数として保存しているため、どこからでもアクセスできることです。次に、ツリーのさらに下のステートフルウィジェットのinitメソッド内でその変数にアクセスする必要があります。デバッグモードでは問題ないようですが、リリースモードでは、メディアクエリ(ビルド内にある必要があります)を作成するウィジェットのビルドメソッドが奇妙に一度呼び出され、メディアクエリの結果はSize(0.0、0.0)になります。 、その後、ツリーのさらに下にあるウィジェットのinitメソッドが呼び出され、メディアクエリを含むビルドメソッドがさらに2回呼び出されます(今回は正しい画面サイズで)。その結果、彼はinitメソッド内に正しい画面サイズを持っていません。

6
footurist

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

未来はもっと早く得られたに違いありません。 State.initState、State.didUpdateConfig、またはState.didChangeDependenciesの間。 FutureBuilderの構築時のState.buildまたはStatelessWidget.buildメソッドの呼び出し中に作成しないでください。 futureがFutureBuilderと同時に作成される場合、FutureBuilderの親が再構築されるたびに、非同期タスクが再起動されます。

一般的なガイドラインは、すべてのビルドメソッドがすべてのフレームで呼び出されると想定し、省略された呼び出しを最適化として扱うことです。

https://github.com/flutter/flutter/issues/27847#issuecomment-462868299 から取得)

4
bunny