🫡

【Flutter】Don't use 'BuildContext's across async gaps...

2024/12/25に公開

現象

ボタンタップ時、「非同期処理の中で、画面遷移を行う処理」を行う場合、画面遷移部分で警告文が表示されます。

onTap: () async {
    await Future.delayed(const Duration(seconds: 1));
    Navigator.of(context).pop(); // ここで警告文が表示される
},
警告文
Don't use 'BuildContext's across async gaps.
Try rewriting the code to not reference the 'BuildContext'.

実際はボタンタップ後、非同期処理実行中に画面を移動した場合に処理が停止するという問題につながる様です。

対応

statefulWidgetとstatelessWidgetで対応方法が違います。
何をしているかについては参考記事をご覧ください。

statefulWidgetの場合

onTap: () async {
    await Future.delayed(const Duration(seconds: 1));
    if (mounted) return;   // 追加
    Navigator.of(context).pop();
},

statelessWidgetの場合

onTap: () async {
    await Future.delayed(const Duration(seconds: 1));
    if (!context.mounted) return;  // 追加
    Navigator.of(context).pop();
},

参考

以下の記事を参考にさせていただきました。
https://zenn.dev/flutteruniv_dev/articles/ef7b64cacc063c#discuss

以前はStatelessWidgetは対応されていなかった様ですが、現在は対応されていました。

Discussion