Bracer
在各個Activity或者各個Fragment之間安全快速的傳遞參數(shù)
First Blood
親,都2020年了,還在寫這樣的代碼嗎?
val param1 = intent.getStringExtra("param1")
//param1 可能為空,所以我們要判空
if (param1 != null) {
//using param1
}
或者
class ActivityB : AppCompatActivity() {
private fun gotoActivityA() {
val intent = Intent(this, ActivityA::class.java)
intent.putExtra("key_1", "123")
startActivity(intent)
}
}
class ActivityA : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//oh shit, wtf!! 寫錯了key的名字,導致一直獲取不到值
val valueA = intent.getStringExtra("key_l")
}
}
更有甚者:
//Oh my god! 每個Fragment都要這么寫一遍嗎?
class FragmentA : Fragment() {
var a: String = ""
var b: String = ""
companion object {
fun newFragment(a: String, b: String): FragmentA {
val fragmentA = FragmentA()
val bundle = Bundle()
bundle.putString("key_a", a)
bundle.putString("key_b", b)
fragmentA.arguments = bundle
return fragmentA
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
a = it.getString("key_a") ?: ""
b = it.getString("key_b") ?: ""
}
}
}
我只是想簡單傳個參數(shù),為什么要讓我寫這么多代碼???我好累...
別怕,現(xiàn)在有了Bracer!!
Double kill
來看看新世紀應該如何正確傳遞參數(shù)吧
在Fragment中獲取參數(shù):
class MutableParamsFragment : Fragment() {
//基本類型
var intParams by mutableParams<Int>()
var booleanParams by mutableParams<Boolean>()
var stringParams by mutableParams<String>()
//自定義類型
var customParams by mutableParams<CustomParams1>()
//list
var intListParams by mutableParams<ArrayList<Int>>()
var stringListParams by mutableParams<ArrayList<String>>()
//array
var intArrayParams by mutableParams<IntArray>()
var arrayCustomParams by mutableParams<Array<CustomParams1>>()
//其他任意類型
//...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//直接使用,不需要再手動從Arguments中讀取了
println(intParams)
println(booleanParams)
println(stringParams)
println(customParams)
println(intListParams)
println(stringListParams)
println(intArrayParams)
}
}
如你所見,從Fragment里獲取參數(shù)就是這么簡單,并且非常安全??!
并且支持幾乎所有的類型!
你不會再遇到空指針null,所有的參數(shù)都會有默認值;
不會遇到key寫錯的情況,所有的參數(shù)默認都以自身的名字作為key.
等同于:
val byteParams = arguments.getByte("byteParams", 0)
var stringParams = arguments.getString("stringParams") ?: ""
接下來我們來見識一下如何傳遞參數(shù):
val fragment = MutableParamsFragment().apply {
intParams = 1 //賦值即可
booleanParams = true
stringParams = "123"
customParams = CustomParams1()
intListParams = arrayListOf(1,2,3)
intArrayParams = IntArray(2) { it }
}
//show this Fragment
val beginTransaction = supportFragmentManager.beginTransaction()
beginTransaction.add(R.id.frameLayout, fragment, "")
beginTransaction.commit()
Amazing!! 是的就是這么神奇,傳遞參數(shù)就是這么簡單!
Double Kill
接下來看一下Activity的情況吧
class MutableParamsActivity : AppCompatActivity() {
//基本類型
var intParams by mutableParams<Int>()
var booleanParams by mutableParams<Boolean>()
var stringParams by mutableParams<String>()
//自定義類型
var customParams by mutableParams<CustomParams1>()
//list
var intListParams by mutableParams<ArrayList<Int>>()
var stringListParams by mutableParams<ArrayList<String>>()
//array
var intArrayParams by mutableParams<IntArray>()
var arrayCustomParams by mutableParams<Array<CustomParams1>>()
//其他任意類型
//...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
//直接使用,不需要再手動從Intent中讀取了
println(intParams)
println(booleanParams)
println(stringParams)
println(customParams)
println(intListParams)
println(stringListParams)
println(intArrayParams)
}
}
和Fragment類似,從Activity里獲取參數(shù)依然這么簡單,并且依舊非常安全??!
你不會再遇到空指針null,所有的參數(shù)都會有默認值;
不會遇到key寫錯的情況,所有的參數(shù)默認都以自身的名字作為key.
等同于:
val byteParams = intent.getByteExtra("byteParams", 0)
var stringParams = intent.getStringExtra("stringParams") ?: ""
接下來我們來見識一下如何傳遞參數(shù):
MutableParamsActivity().apply {
intParams = 1 //賦值即可
booleanParams = true
stringParams = "123"
customParams = CustomParams1()
intListParams = arrayListOf(1,2,3)
intArrayParams = IntArray(2) { it }
}.start(context)
???確認你沒寫錯?為什么能new一個Activity???
是的,就是這么神奇,和Fragment的用法幾乎一致,只是略微做了點騷操作!
Triple Kill
除此之外,Bracer還支持一些其他特性.
例如自定義key:
var customKeyParams by mutableParams<Byte>("this is custom key")
或者支持自定義默認值:
var defaultParams by mutableParams<BigDecimal>(defaultValue = BigDecimal.ONE)