メインコンテンツにスキップ

use_build_context_synchronously

安定版
Flutter

非同期処理の合間にBuildContextを使用しないでください。

詳細

#

非同期処理の合間にBuildContextを使用しないでください。

後で使用するためにBuildContextを保存すると、診断が困難なクラッシュに easily 繋がる可能性があります。非同期処理の合間は、暗黙的にBuildContextを保存しており、コードを書いている際に最も見落としやすい箇所の一つです。

BuildContextが使用される場合、非同期処理の合間の後にはmountedプロパティをチェックする必要があります。これはBuildContextへのアクセス方法によります。

  • Statecontextプロパティを使用する場合、Statemountedプロパティをチェックする必要があります。
  • その他のBuildContextインスタンス(ローカル変数や関数引数など)の場合、BuildContextmountedプロパティをチェックする必要があります。

悪い例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));
  Navigator.of(context).pop();
}

良い例

dart
void onButtonTapped(BuildContext context) {
  Navigator.of(context).pop();
}

良い例

dart
void onButtonTapped(BuildContext context) async {
  await Future.delayed(const Duration(seconds: 1));

  if (!context.mounted) return;
  Navigator.of(context).pop();
}

良い例

dart
abstract class MyState extends State<MyWidget> {
  void foo() async {
    await Future.delayed(const Duration(seconds: 1));
    if (!mounted) return; // Checks `this.mounted`, not `context.mounted`.
    Navigator.of(context).pop();
  }
}

有効にする

#

use_build_context_synchronouslyルールを有効にするには、analysis_options.yaml ファイルのlinter > rulesの下にuse_build_context_synchronouslyを追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    - use_build_context_synchronously

代わりにYAMLマップ構文を使用してリンタールールを設定している場合は、linter > rulesの下にuse_build_context_synchronously: trueを追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    use_build_context_synchronously: true