[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근 2

2022. 6. 10. 10:49Programming/Flutter

반응형

이전에 isolate에서 SharedPreferences 패키지에 접근 시, 문제가 발생해서 파일에 데이터를 저장한 후 SharedPreferences처럼 사용하는 방법을 기재한 적이 있습니다. 당시 FirebaseMessaging.onBackgroundMessage() 함수에 넘겨준 콜백 함수가 Android에서는 isolate로 동작하고, SharedPreferences 내부 구현은 네이티브로 구현되어있는데, isolate에서 SharedPreferences에 접근이 안되는 원인을 찾지 못해서였죠. 당시에는 path_provider에서 제공하는 getApplicationDocumentsDirectory()함수를 사용해서 처리했고, 당시에는 isolate에서 파일을 읽고 쓰는 걸 확인했었습니다.

[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근

 

[Flutter] isolate와 SharedPreferences, 그리고 파일에 대한 접근

예쓰! 검은곰입니다. 오늘은 Flutter의 isolate와 shared_preferences에 대한 내용을 정리하려고 합니다. 정확히는 이번에 굉장히 골머리를 겪게했던 이슈에 대한 정리로, 여러분들은 Isolate 내에서는 native

zerodice0.tistory.com

그리고 시간이 흘러 바야흐로 2022년, 앱이 백그라운드 상태에 있을 시 푸시 메시지가 동작하지 않는다는 이슈가 발생합니다. 패키지 버전을 맞추느라 동료분이 디버깅을 해주신 결과, FirebaseMessaging.onBackgroundMessage()에 넘겨준 콜백 함수 내에서, 즉 isolate내에서 path_providergetApplicationDocumentsDirectory() 함수가 정상 동작하지 않는 것을 알 수 있었죠. 엥? 잘 되던게 버전 올리니까 갑자기 안된다구? path_provider 문서에 deprecated된 내용이 있나 확인해봤지만, 별다른 내용이 없었습니다.

검색해보니 아래의 이슈를 발견할 수 있었습니다. isolate에서 서드 파티 패키지를 사용할 시 초기화가 자동으로 진행되지 않는 이슈가 있는데… 각 플랫폼 별로 제공되는 패키지의 registerWith()를 호출하면 된다고 기재되어있는 걸 확인할 수 있습니다. 향후에는 Flutter 내에서 자동으로 초기화되도록 업데이트 될 예정이므로, 이 기록은 큰 의미가 없을수도 있겠네요.

https://github.com/flutter/flutter/issues/98473

 

[shared_preferences] MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_prefe

I'm working on a Flutter app in which I'm using the shared_preferences: ^2.0.13 package. Flutter version : 2.10.1 (latest) gradle version: 6.7 Android gradle plugin version: 4.1.3 kotlin ve...

github.com

아래와 같이 안드로이드일 때는 안드로이드 패키지에서 제공하는 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();
  }
}
반응형