[분석결과]
sharedPreference 패키지에서는 특정 안드로이드 sharedPreference접근할수있는 기능을 제공하지 않는다.
https://pub.dev/packages/shared_preferences
따라서, 세가지 방안을 찾았다.
채널링을 통해 Android 특정 프리퍼런스 접근
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)
}
}
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);
}
채널링을 통해 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);
}
}
플러터에서 특정 파일 가져와서 접근
(이렇게 했을경우 마이그레이션 진행후 해당 파일 삭제 -> 다음 마이그레이션때 파일 존재 유무를 통해 스킵)
*폴더변경 샘플
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