2020年春节期间,疫情爆发,这里很多企业延迟上班。相信和我一样,不工作的容易让人产生危机感。因为我是Android开发工程师,进2年Kotlin发展很快,很多技术公司都在使用转变Kotlin开发APP,为了提升自己,我决定将一个已经上线的简单项目转换成Kotlin,这里说一下我在转换中遇到的问题。
项目还没有完全转换,这里我只说下其中一部分,下面是我的项目包
首先说下项目架构是基于MVP的,因为之前就是mvp这里为了方便对架构不做改变。
这里之前依赖的一个xmvp依赖包,将这个也转换成kotlin,
这里kotlin中不管是继承还是实现都是使用:符号,这里先把被继承(被实现)类说成父类,继承(实现)类说成子类,如果父类有构造或者泛型,那么之类也必须有构造和泛型。Kotlin中 out 和 in的区别可以去Kotlin网站查看。
这里说下Kotlin中的共享参数,这个说实话确实是比androidSharedPreferences共享参数感觉方便很多,下面贴出代码
class Preference<T>(val name: String, private val default: T) {
private val prefs: SharedPreferences by lazy { KBaseApp.instance.applicationContext.getSharedPreferences(name, Context.MODE_PRIVATE) }
operator fun getValue(thisRef: Any?, property: KProperty<*>): T {
LoggerHelper.i("调用$this 的getValue()")
return getSharePreferences(name, default)
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
LoggerHelper.i("调用$this 的setValue() value参数值为:$value")
putSharePreferences(name, value)
}
@SuppressLint("CommitPrefEdits")
private fun putSharePreferences(name: String, value: T) = with(prefs.edit()) {
when (value) {
is Long -> putLong(name, value)
is String -> putString(name, value)
is Int -> putInt(name, value)
is Boolean -> putBoolean(name, value)
is Float -> putFloat(name, value)
else -> throw IllegalArgumentException("This type of data cannot be saved!")
}.apply()
}
@Suppress("UNCHECKED_CAST")
private fun getSharePreferences(name: String, default: T): T = with(prefs) {
val res: Any = when (default) {
is Long -> getLong(name, default)
is String -> getString(name, default)
is Int -> getInt(name, default)
is Boolean -> getBoolean(name, default)
is Float -> getFloat(name, default)
else -> throw IllegalArgumentException("This type of data cannot be saved!")
}
return res as T
}
}
object KSP {
var sign: String by Preference( PublicCategory.SIGNTOKEN, "")//签名
var login_status: String by Preference( PublicCategory.LOGIN_SUCCESS, "")//登录状态
var login_admin: String by Preference( PublicCategory.LOGIN_ADMIN, "")//登录账号
var member_phone: String by Preference( PublicCategory.MEMBER_PHONE, "")//会员手机号
var member_id: String by Preference( PublicCategory.MEMBER_ID, "")//会员ID
}
代码中使用直接调用赋值就可以。
这里只说这些吧,后续遇到的问题,还会和大家分享