화면을 ConsumerStatefulWidget으로 감싸면 provider를 참조할 수 있도록 하는 ref 객체를 사용할 수 있게 됨
1
2
3
4
5
6
7
8
9
10
11
12
13
classLocationInfoPageextendsConsumerStatefulWidget{constLocationInfoPage({super.key});@overrideConsumerState<ConsumerStatefulWidget>createState()=>LocationInfoState();}classLocationInfoStateextendsConsumerState<LocationInfoPage>{@overrideWidgetbuild(BuildContextcontext){// 코드 작성...}}
classLocationData{finaldoublelatitude;finaldoublelongitude;LocationData({requiredthis.latitude,requiredthis.longitude});}finallocationProvider=ChangeNotifierProvider<LocationProvider>((ref){returnLocationProvider();});classLocationProviderextendsChangeNotifier{LocationData?_currentLocation;LocationData?getcurrentLocation=>_currentLocation;lateTimerlocationTimer;// 위치 업데이트 메서드Future<void>updateLocation()async{try{// 10초마다 위치 업데이트locationTimer=Timer.periodic(constDuration(seconds:10),(timer)async{debugPrint("==== locationProvider... updateLocation ====");Positionposition=awaitGeolocator.getCurrentPosition();_currentLocation=LocationData(latitude:position.latitude,longitude:position.longitude);notifyListeners();// Provider에게 상태 변경을 알림});}catch(e){debugPrint('Error updating location: $e');}}@overridevoiddispose(){super.dispose();locationTimer.cancel();}}
classLocationInfoPageextendsConsumerStatefulWidget{constLocationInfoPage({super.key});@overrideConsumerState<ConsumerStatefulWidget>createState()=>LocationInfoState();}classLocationInfoStateextendsConsumerState<LocationInfoPage>{@overridevoidinitState(){super.initState();requestLocationPermission();}// 위치 권한 받아오기Future<void>requestLocationPermission()async{LocationPermissionpermission;permission=awaitGeolocator.checkPermission();if(permission==LocationPermission.denied){permission=awaitGeolocator.requestPermission();if(permission==LocationPermission.denied){debugPrint("location permission is denied.");return;}else{ref.read(locationProvider).updateLocation();}}else{ref.read(locationProvider).updateLocation();}}@overrideWidgetbuild(BuildContextcontext){finallocationData=ref.watch(locationProvider);// provider의 값을 얻어 변화를 모니터링returnScaffold(body:Center(child:Column(mainAxisAlignment:MainAxisAlignment.center,children:[Text("🏃♀️ latitude: ${locationData.currentLocation?.latitude ?? ''}"),Text("🏃♀️ longitude: ${locationData.currentLocation?.longitude ?? ''}"),],),),);}}
Leave a comment