使用Kotlion对Preferences分装

it2022-05-05  224

本片文章主要说的是主要是用属性代理的方法实现对Preferences的分装:

多余的不多说,直接上代码:

1、第一步首先对外部提供全局上下文,方便引用 

/** * Application 基类 */ private lateinit var INAPPLICATION: Application //外部全局调用 object AppContext : ContextWrapper(INAPPLICATION) open class BaseApplication : Application() { lateinit var appComponent: AppComponent override fun onCreate() { super.onCreate() INAPPLICATION = this } }

2、关键的实现全在这里了


/** * Created by Evlis on 2019/7/17. * Preferences 扩展 -属性代理 * @param name 传入的键 * @param default 默认值 * @param flieName 文件名当前默认default */ class Preference<T>(val key:String, val default: T, val flieName : String = "default") :ReadWriteProperty<Any?,T>{ //初始化 private val prefs by lazy { AppContext.getSharedPreferences(flieName,Context.MODE_PRIVATE) } //获取当前值 override fun getValue(thisRef: Any?, property: KProperty<*>): T { return getPrrefs(key) } /** * 获取当前值 * @param 键 */ private fun getPrrefs(key: String):T{ return when(default){ is String -> prefs.getString(key,default) is Boolean -> prefs.getBoolean(key,default) is Int -> prefs.getInt(key,default) is Long -> prefs.getLong(key,default) else -> throw IllegalArgumentException("不支持的类型") } as T } //设置当前值 @RequiresApi(Build.VERSION_CODES.GINGERBREAD) override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { putPrefs(key,value) } /** * 设置当前当前键所对应的值 * @param key 键 * @param value 值 */ private fun putPrefs(key:String, value:T){ with(prefs.edit()){ when(value){ is String -> putString(key,value) is Boolean -> putBoolean(key,value) is Float -> putFloat(key,value) is Int -> putInt(key,value) is Long -> putLong(key,value) else -> throw IllegalArgumentException("不支持的类型") }.apply() } } }

3、方便调用向外部提供形如变量的方式

/** * Created by Evlis on 2019/7/17. * 存取调取 */ object PreferencesUtils { var _phone: String by Preference(PreStatic.PHONE, PreStatic.DEFAULT) var _password: String by Preference(PreStatic.PASSW, PreStatic.DEFAULT) } /** * 静态量存储 */ class PreStatic private constructor(val value: String) { companion object { val DEFAULT: String = "" //账号 @JvmField val PHONE: String = "phone" //密码 @JvmField val PASSW: String = "password" } }

4、具体调用看下面

/** * 具体使用 */ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) showContent() bt_save.setOnClickListener { //存数据 PreferencesUtils._phone = et_name.text.toString() PreferencesUtils._password = et_name.text.toString() showContent() } } /** * 显示内容 */ private fun showContent() { //取数据 show_content_name.text = "账号:"+ PreferencesUtils._phone show_content_pass.text = "密码:"+ PreferencesUtils._password et_name.hint = PreferencesUtils._phone et_pass.hint = PreferencesUtils._password } }

5、项目地址:[https://github.com/ElvisBin/KtPreference]

 


最新回复(0)