비동기 갭을 넘어 BuildContext를 쓰지 마세요

비동기 갭을 넘어 BuildContext를 쓰지 마세요 (use_build_context_synchronously)

StatefulWidget에서 비동기 갭(async gap)을 지난 뒤, mounted 속성을 먼저 확인하지 않고 BuildContext를 사용할 때 분석기가 띄우는 진단(린트 규칙)이에요.

출처: use_build_context_synchronously

본문

설명

분석기는 StatefulWidget이 비동기 갭 이후에 mounted 속성을 먼저 확인하지 않은 채 BuildContext를 참조할 때 이 진단을 냅니다.

BuildContext를 나중에 쓰려고 저장해 두면 원인 찾기 어려운 크래시로 이어질 수 있어요. 비동기 갭은 BuildContext를 암묵적으로 저장해 두는 셈이라, 진단할 때 놓치기 쉽습니다.

예시

다음 코드는 await 이후에 context를 생성자로 넘기기 때문에 이 진단이 발생해요.

import 'package:flutter/material.dart';

class const MyWidget({super.key}) extends Widget {
  void onButtonTapped(BuildContext context) async {
    await Future.delayed(const Duration(seconds: 1));
    Navigator.of(context).pop();
  }
}

일반적인 해결 방법

비동기 갭을 없앨 수 있다면 없애는 게 가장 깔끔해요.

import 'package:flutter/material.dart';

class const MyWidget({super.key}) extends Widget {
  void onButtonTapped(BuildContext context) {
    Navigator.of(context).pop();
  }
}

비동기 갭을 없앨 수 없다면, mountedcontext의 사용을 감싸 보호해 주면 됩니다.

import 'package:flutter/material.dart';

class const MyWidget({super.key}) extends Widget {
  void onButtonTapped(BuildContext context) async {
    await Future.delayed(const Duration(seconds: 1));
    if (context.mounted) {
      Navigator.of(context).pop();
    }
  }
}