[Flutter] Android 특정 sharedPreference 마이그레이션!

메모하는 개발자·2022년 4월 27일
0

Flutter삽질방지

목록 보기
9/9

[분석결과]
sharedPreference 패키지에서는 특정 안드로이드 sharedPreference접근할수있는 기능을 제공하지 않는다.
https://pub.dev/packages/shared_preferences

따라서, 세가지 방안을 찾았다.

방안1.

채널링을 통해 Android 특정 프리퍼런스 접근

  1. 'test'라는 sharedPreference접근하는 코틀린 파일 생성
class PreferenceManager private constructor(context: Context) {
    private val pref: SharedPreferences
    fun savePreferencesString(key: String?, value: String?) {
        editor.putString(key, value).apply()
    }

    fun getPreferencesString(key: String?, defValue: String?): String? {
        var temp = pref.getString(key, defValue)
        return pref.getString(key, defValue)
    }

    private val editor: SharedPreferences.Editor
        private get() = pref.edit()

    companion object {
        private var _INSTANCE: PreferenceManager? = null
        fun getInstance(context: Context): PreferenceManager? {
            if (_INSTANCE == null) {
                _INSTANCE = PreferenceManager(context)
            }
            return _INSTANCE
        }
    }

    init {
        pref = context.getSharedPreferences("test", Context.MODE_PRIVATE)
    }
}
  1. 프리퍼런스 접근 채널링 코드
if(call.method == "getPreferencesString") {
                // Android 특정 이름의 프리퍼런스(deviceInfo) 접근. 추후 handler를 통한 공통화 예정
                // PreferencesUtil -> getPreferencesString
                var key = call.argument<String>("key");
                var defValue = call.argument<String>("defValue");
                var preferenceManager = PreferenceManager.getInstance(appContext);
                
                if(preferenceManager != null){
                    var value = preferenceManager.getPreferencesString(key, defValue);
                    result.success(value);
                }
                result.success(defValue);
            }

방안2.

채널링을 통해 Android 파일 접근으로 특정 프리퍼런스 접근
https://www.flutterclutter.dev/flutter/tutorials/read-shared-preferences-from-native-apps/2021/9753/

채널링 코드
class MainActivity: FlutterActivity() {
    private val CHANNEL = "mypackage.com/shared_pref_migration"

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler {
            call, result ->
            when (call.method) {
                "getStringValue" -> {
                    val key: String? = call.argument<String>("key");
                    val file: String? = call.argument<String>("file");

                    when {
                        key == null -> {
                            result.error("KEY_MISSING", "Argument 'key' is not provided.", null)
                        }
                        file == null -> {
                            result.error("FILE_MISSING", "Argument 'file' is not provided.", null)
                        }
                        else -> {
                            val value: String? = getStringValue(file, key)
                            result.success(value)
                        }
                    }
                }
                else -> {
                    result.notImplemented()
                }
            }
        }
    }

    private fun getStringValue(file: String, key: String): String? {
        return context.getSharedPreferences(
                file,
                Context.MODE_PRIVATE
        ).getString(key, null);
    }
}

방안3.

플러터에서 특정 파일 가져와서 접근
(이렇게 했을경우 마이그레이션 진행후 해당 파일 삭제 -> 다음 마이그레이션때 파일 존재 유무를 통해 스킵)

*폴더변경 샘플
  Future<File> _getLocalFile(String fileName) async {
    // get the path to the document directory.
    String dir = (await getApplicationDocumentsDirectory()).path;
    // Change saved directory from /app_flutter to /shared_prefs
    dir = dir.substring(0, dir.length - ('app_flutter'.length));
    dir = dir + 'shared_prefs';
    File f = new File('$dir/$fileName');
    return f;
  }

(참고) https://github.com/Rockvole/flutter/blob/master/filename_preferences/filename_preferences.dart

(참고)
https://github.com/flutter/flutter/issues/14337

0개의 댓글