비동기 갭을 넘어 BuildContext를 쓰지 마세요
비동기 갭을 넘어 BuildContext를 쓰지 마세요 (use_build_context_synchronously)
StatefulWidget에서 비동기 갭(async gap)을 지난 뒤, mounted 속성을 먼저 확인하지 않고 BuildContext를 사용할 때 분석기가 띄우는 진단(린트 규칙)이에요.
본문
설명
분석기는 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();
}
}
비동기 갭을 없앨 수 없다면, mounted로 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));
if (context.mounted) {
Navigator.of(context).pop();
}
}
}