2022. 6. 10. 10:49ㆍProgramming/Flutter
이전에 isolate
에서 SharedPreferences
패키지에 접근 시, 문제가 발생해서 파일에 데이터를 저장한 후 SharedPreferences
처럼 사용하는 방법을 기재한 적이 있습니다. 당시 FirebaseMessaging.onBackgroundMessage()
함수에 넘겨준 콜백 함수가 Android에서는 isolate로 동작하고, SharedPreferences
내부 구현은 네이티브로 구현되어있는데, isolate
에서 SharedPreferences
에 접근이 안되는 원인을 찾지 못해서였죠. 당시에는 path_provider에서 제공하는 getApplicationDocumentsDirectory()
함수를 사용해서 처리했고, 당시에는 isolate
에서 파일을 읽고 쓰는 걸 확인했었습니다.
[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근
그리고 시간이 흘러 바야흐로 2022년, 앱이 백그라운드 상태에 있을 시 푸시 메시지가 동작하지 않는다는 이슈가 발생합니다. 패키지 버전을 맞추느라 동료분이 디버깅을 해주신 결과, FirebaseMessaging.onBackgroundMessage()
에 넘겨준 콜백 함수 내에서, 즉 isolate
내에서 path_provider
의 getApplicationDocumentsDirectory()
함수가 정상 동작하지 않는 것을 알 수 있었죠. 엥? 잘 되던게 버전 올리니까 갑자기 안된다구? path_provider
문서에 deprecated
된 내용이 있나 확인해봤지만, 별다른 내용이 없었습니다.
검색해보니 아래의 이슈를 발견할 수 있었습니다. isolate
에서 서드 파티 패키지를 사용할 시 초기화가 자동으로 진행되지 않는 이슈가 있는데… 각 플랫폼 별로 제공되는 패키지의 registerWith()
를 호출하면 된다고 기재되어있는 걸 확인할 수 있습니다. 향후에는 Flutter
내에서 자동으로 초기화되도록 업데이트 될 예정이므로, 이 기록은 큰 의미가 없을수도 있겠네요.
https://github.com/flutter/flutter/issues/98473
아래와 같이 안드로이드일 때는 안드로이드 패키지에서 제공하는 registerWith()
를 호출하니, 더 이상 예외가 발생하지 않는 걸 확인할 수 있었습니다. 아래 코드 내용은 안드로이드에 대해서만 처리하고 있지만, iOS 역시 마찬가지로 처리해줘야겠죠?
import 'package:path_provider_android/path_provider_android.dart';
import 'package:shared_preferences_android/shared_preferences_android.dart';
Future<void> isolateFunction() {
if (Platform.isAndroid) {
PathProviderAndroid.registerWith();
SharedPreferencesAndroid.registerWith();
}
}
'Programming > Flutter' 카테고리의 다른 글
Provider의 ChangeNotifier와 Dispose와 비동기 함수 (0) | 2024.06.20 |
---|---|
최상위 Navigator와 MaterialApp, 그리고 Navigator.push()와 GetX.to() (0) | 2022.07.05 |
[Flutter] 백그라운드에서 띄운 푸시 알람 메시지를 터치해서 앱을 실행했을 때, getInitialMessage()가 동작하지 않는다. (0) | 2022.02.04 |
[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근 (2) | 2021.11.19 |
[Flutter] Flutter에서 SharedPreferences에 저장한 값을, Android 네이티브 영역에서 참조해보자. (0) | 2021.10.28 |