programming/flutter(dart)

[flutter] Could not find the correct Provider<ProviderClass> above this <WidgetName> Widget 에러 해결

worldint 2024. 5. 8. 11:21

아직 flutter 학습이 부족하여 내용이 잘못 되었을 수도 있습니다 그냥 해결 방법 정도로 참고만 해주세요

 

 

1. 상황 : 

외주 받아서 만들고 있는 앱에서
flutter_blue 패키지를 사용하여 blue tooth를 스캔하고 연결한 뒤에
blueTooth 서비스 정보를 Provider에 담아서 다른 위젯에서 사용하는 코드를 작성중이다

아래 코드는 home_body.dart 위젯에서 버튼을 클릭하면
bleScan.dart 위젯으로 Navigator.push()를 사용해서 이동하는 코드인데

onPressed: () {
                Navigator.push(
                    context,
                    MaterialPageRoute(
                        builder: (context) => Provider.value(
                            value: Provider.of<BlueToothProvider>(context
                                ),
                            child: BleScan())));
              }

 

Navigator.push를 사용하면 하위 위젯이 아니고 새롭게 생성된 위젯이어서 

이렇게 HomeScreen 외부에 BleScan이 생겨난다

그래서 BleScan 위젯에서 바로 Provider.of 로 접근 할 수 없기 때문에
위 코드처럼 Provider.value를 사용해서

이미 생성된 provider객체를 라우팅되는 위젯쪽으로 넘겨주면 될 것으로 생각했다

Could not find the correct Provider<ProviderClass> above this Builder Widget 발생

그런데 이런 에러가 또 발생함

2. 원인 : 

  1. 저 MaterialPateRoute 안쪽의 builder매개변수로 전달된 callback함수에서는
    HomeScreen(상위위젯)에서 create한 Provider에 접근이 안되는것으로 보인다.
    ( 새로운 context 저 지점에서 생성되어서 HomeScreen의 context와 다른 context로 판단됨 ) 
  2. 그래서 저렇게 value를 사용해서 기존에 있는 객체를 넘겨주려 하면 못 찾겠다는 에러가 발생하는 것으로 보인다

 

3. 결론 : 

두가지 방법이 있는데 

1. HomeScreen이 아닌 더 상위에 있는 MaterialApp을 ChangeNotifierProvier로 감싸줘서
전역 provider로 어느 곳 에서 든지 다 사용 할 수 있게 하거나



2. 아래 코드처럼 create을 해서 다시 넘겨주는것

MaterialPageRoute(
	builder: (context) => ChangeNotifierProvider(
		create: (BuildContext context) => BlueToothProvider(),
		child: BleScan()
        )
	)
);