国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Kotlin 輕量級(jí)Android開(kāi)發(fā)

這篇具有很好參考價(jià)值的文章主要介紹了Kotlin 輕量級(jí)Android開(kāi)發(fā)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Kotlin 是什么

Kotlin是一門(mén)運(yùn)行在JVM之上的語(yǔ)言。

它由Jetbrains創(chuàng)建,而Jetbrains則是諸多強(qiáng)大的工具(如知名的Java IDE IntelliJ IDEA)背后的公司。Kotlin是一門(mén)非常簡(jiǎn)單的語(yǔ)言,其主要目標(biāo)之一就是提供強(qiáng)大語(yǔ)言的同時(shí)又保持簡(jiǎn)單且精簡(jiǎn)的語(yǔ)法。
android kotlin,kotlin,android,java

kotlin 特性

其主要特性如下所示:

  1. 輕量級(jí):這一點(diǎn)對(duì)于Android來(lái)說(shuō)非常重要。項(xiàng)目所需要的庫(kù)應(yīng)該盡可能的小。Android對(duì)于方法數(shù)量有嚴(yán)格的限制,Kotlin只額外增加了大約6000個(gè)方法。
  2. 互操作:Kotlin可與Java語(yǔ)言無(wú)縫通信。這意味著我們可以在Kotlin代碼中使用任何已有的Java庫(kù);因此,即便這門(mén)語(yǔ)言還很年輕,但卻已經(jīng)可以使用成百上千的庫(kù)了。除此之外,Kotlin代碼還可以為Java代碼所用,這意味著我們可以使用這兩種語(yǔ)言來(lái)構(gòu)建軟件。你可以使用Kotlin開(kāi)發(fā)新特性,同時(shí)使用Java實(shí)現(xiàn)代碼基的其他部分。
  3. 強(qiáng)類型:我們很少需要在代碼中指定類型,因?yàn)榫幾g器可以在絕大多數(shù)情況下推斷出變量或是函數(shù)返回值的類型。這樣就能獲得兩個(gè)好處:簡(jiǎn)潔與安全。使用var聲明可變參數(shù),val聲明不可變參數(shù) varvar是一個(gè)可變變量,這是一個(gè)可以通過(guò)重新分配來(lái)更改為另一個(gè)值的變量。這種聲明變量的方式和Java中聲明變量的方式一樣。 val: val是一個(gè)只讀變量,這種聲明變量的方式相當(dāng)于java中的final變量。一個(gè)val創(chuàng)建的時(shí)候必須初始化,因?yàn)橐院蟛荒鼙桓淖儭?上段代碼: var name = "ztz" println(name) name = "yif" println(name) val finalValue = "i v"; println(finalValue); 結(jié)果如下: ztz yif iv
  4. 空安全:Java最大的一個(gè)問(wèn)題就是null。如果沒(méi)有對(duì)變量或是參數(shù)進(jìn)行null判斷,那么程序當(dāng)中就有可能拋出大量的NullPointerException,然而在編碼時(shí)這些又是難以檢測(cè)到的。Kotlin使用了顯式的null,這會(huì)強(qiáng)制我們?cè)诒匾獣r(shí)進(jìn)行null檢查。
  5. 語(yǔ)法糖
    • 類的簡(jiǎn)化,隱式getter()、setter()
    • 接口的默認(rèn)實(shí)現(xiàn)
    • lambda與高階函數(shù)
    • 空指針安全,編譯時(shí)期的空指針檢查
    • 流式集合操作 map(), forEach()
  6. 新特性
    • 函數(shù)拓展、屬性拓展
    • 屬性代理

Kotlin 輕量級(jí)開(kāi)發(fā)

Null安全

Kotlinnull安全的。如果一個(gè)類型可能為null,那么我們就需要在類型后面加上一個(gè)?。這樣,每次在使用該類型的變量時(shí),我們都需要進(jìn)行null檢查。比如說(shuō),如下代碼將無(wú)法編譯通過(guò):

var artist: Artist? = null?
artist.print()

第2行會(huì)顯示一個(gè)錯(cuò)誤,因?yàn)闆](méi)有對(duì)變量進(jìn)行null檢查。我們可以這樣做:

if (artist != null) {
? artist.print()?
}

這展示了Kotlin另一個(gè)出色的特性:智能類型轉(zhuǎn)換。如果檢查了變量的類型,那就無(wú)需在檢查作用域中對(duì)其進(jìn)行類型轉(zhuǎn)換。這樣,我們現(xiàn)在就可以在if中將artist作為Artist類型的變量了。這對(duì)于其他檢查也是適用的。還有一種更簡(jiǎn)單的方式來(lái)檢查null,即在調(diào)用對(duì)象的函數(shù)前使用?。甚至還可以通過(guò)Elvis運(yùn)算符?提供另外一種做法:

val name = artist?.name ?: ""

數(shù)據(jù)類data

Java中,如果想要?jiǎng)?chuàng)建數(shù)據(jù)類或是POJO類(只保存了一些狀態(tài)的類),我們需要?jiǎng)?chuàng)建一個(gè)擁有大量字段、getterssetters的類,也許還要提供toStringequals方法:

public class Artist {
    private long id;
    private String name;
    private String url;
    private String mbid;
 
    public long getId() {
        return id;
    }
 
    public void setId(long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getUrl() {
        return url;
    }
 
    public void setUrl(String url) {
        this.url = url;
    }
 
    public String getMbid() {
        return mbid;
    }
 
    public void setMbid(String mbid) {
        this.mbid = mbid;
    }
 
    @Override public String toString() {
        return "Artist{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", url='" + url + '\'' +
                ", mbid='" + mbid + '\'' +
                '}';
    }
}

Kotlin中,上述代碼可以寫(xiě)成下面這樣:

data class Artist (?
    var id: Long,
    var name: String,
    var url: String,
    var mbid: String)

Kotlin使用屬性而非字段?;旧希瑢傩跃褪亲侄渭由掀?code>getter與setter。

互操作

Kotlin提供了一些非常棒的互操作特性,這對(duì)于Android開(kāi)發(fā)幫助非常大。其中之一就是擁有單個(gè)方法的接口與lambda表達(dá)式之間的映射。這樣,下面這個(gè)單擊監(jiān)聽(tīng)器:

view.setOnClickListener(object : View.OnClickListener {
    override fun onClick(v: View) {
        toast("Click")?
    }
?})

可以寫(xiě)成這樣:

view.setOnClickListener { toast("Click") }

此外,getterssetters都會(huì)自動(dòng)映射到屬性上。這并不會(huì)造成性能上的損失,因?yàn)樽止?jié)碼實(shí)際上只是調(diào)用原來(lái)的getterssetters。如下代碼所示:

supportActionBar.title = title
textView.text = title
contactsList.adapter = ContactsYifAdapter()

Lambda表達(dá)式

Lambda表達(dá)式會(huì)在極大程度上精簡(jiǎn)代碼,不過(guò)重要的是借助于Lambda表達(dá)式,我們可以做到之前無(wú)法實(shí)現(xiàn)或是實(shí)現(xiàn)起來(lái)非常麻煩的事情。借助于Lambda表達(dá)式,我們可以以一種更加函數(shù)式的方式來(lái)思考問(wèn)題。Lambda表達(dá)式其實(shí)就是一種指定類型,并且該類型定義了一個(gè)函數(shù)的方式。比如說(shuō),我們可以像下面這樣定義一個(gè)變量:

val listener: (View) -> Boolean

該變量可以聲明一個(gè)函數(shù),它接收一個(gè)view并返回這個(gè)函數(shù)。我們需要通過(guò)閉包的方式來(lái)定義函數(shù)的行為:

val listener = { view: View -> view is TextView }

上面這個(gè)函數(shù)會(huì)接收一個(gè)View,如果該viewTextView的實(shí)例,那么它就會(huì)返回true。由于編譯器可以推斷出類型,因此我們無(wú)需指定。還可以更加明確一些:

val listener: (View) -> Boolean = { view -> view is TextView }

借助于Lambda表達(dá)式,我們可以拋棄回調(diào)接口的使用。只需設(shè)置希望后面會(huì)被調(diào)用的函數(shù)即可:

fun asyncOperation(value: Int, callback: (Boolean) -> Unit) {
    ...
    callback(true)?
}
asyncOperation(5) { result -> println("result: $result") }

還有一種更加簡(jiǎn)潔的方式,如果函數(shù)只接收一個(gè)參數(shù),那就可以使用保留字it

asyncOperation(5) { println("result: $it") }

高階函數(shù)

lambda`本身作為一等公民,它是有類型的。比如下面這個(gè)加法表達(dá)式sum的類型為`(Int, Int) -> Int。
val sum: (Int, Int) -> Int = { x, y -> x+y }

一個(gè)變量有類型是再自然不過(guò)的事。而高階函數(shù)的入?yún)⑴c返回值既然是lambda,那其類型奇怪一點(diǎn)也很正常。

fun main(args: Array<String>) {
    // 自定義高階函數(shù), lambda 表達(dá)式 作為入?yún)?/span>
    listOf("1", "2", "3", "4").myForEach { println(it) }

    // 自定義高階函數(shù), lambda 表達(dá)式 作為返回值
//    getLogger()("I'm a Closure")
    var logger = getLogger()
    logger("I'm a Closure")
}

/**
 * 接受一個(gè) lambda 表達(dá)式, 作為遍歷任務(wù)
 */
fun <T> List<T>.myForEach(doTask: (T) -> Unit){
    for(item in this)
        doTask(item)
}

/**
 * 返回一個(gè) lambda 表達(dá)式(閉包), 如: 日志輸出工具 logger
 */
fun getLogger(): (String) -> Unit{
//    return { println(it) }
    return fun (it: String){
        println(it)
    }
}

PS: 看到getLogger()這種用法,你大概意識(shí)到可以像js那樣寫(xiě)閉包了。

接口的默認(rèn)實(shí)現(xiàn)

顧名思義,它便是指接口可以和抽象類一樣,有方法體的默認(rèn)實(shí)現(xiàn)。 我把它歸結(jié)在語(yǔ)法糖里,是因?yàn)?code>java8中早已有了一模一樣的東西,對(duì)應(yīng)的關(guān)鍵字叫default。

interface A {
    fun foo() { println("A") }    // 默認(rèn)實(shí)現(xiàn), 打印"A"
    fun bar()
}
 
interface B {
    fun foo() { println("B") }
    fun bar() { println("bar") }
}
 
// 多繼承時(shí),顯式指定 super<A>.foo() 以去沖突
class D : A, B {
    override fun foo() {
        super<A>.foo()
        super<B>.foo()
    }
 
    override fun bar() {
        super.bar()
    }
}

流式集合操作 map(), forEach()

流式集合操作符,算是很普遍了,任何語(yǔ)言里都有,然而不支持函數(shù)式的話,寫(xiě)起來(lái)比較臃腫。 如下例子,一些操作符的銜接,使得操作邏輯十分清晰,之后需求變動(dòng),比如降序改為升序,也只需改動(dòng)sortedDescending()一行,十分靈活。

fun main(args: Array<String>){
    val list = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    list.filter { it%2==0 }             // 取偶數(shù)
            .map{ it*it }               // 平方
            .sortedDescending()         // 降序排序
            .take(3)                    // 取前 3 個(gè)
            .forEach { println(it) }    // 遍歷, 打印
}
 
// 輸出:
100
64
36

拓展

拓展這個(gè)東西,貌似是以裝飾者模式來(lái)做的。它的效果是在不改源碼的基礎(chǔ)上,添加功能。比如我們要在Activity上加一個(gè)toast(),完全不用卸載基類里。這樣簡(jiǎn)化了很多工作,尤其是對(duì)一些已打成jar包的類。

fun Activity.toast(msg: String) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
/**
 * @author yif
 *
 * 函數(shù)拓展, 屬性拓展
 */
fun main(args: Array<String>) {
    val list = listOf("1", "2", "3", "4")
 
    // 函數(shù)拓展
    list.myForEach { println(it) }
 
    // 屬性拓展
    println("last: ${list.lastItem}")
}
 
/**
 * 拓展 List 類, 加一個(gè)自定義的遍歷方法
 */
fun <T> List<T>.myForEach(doTask: (T) -> Unit){
    for(item in this)
        doTask(item)
}
 
/**
 * 拓展 List 類, 加一個(gè)自定義的長(zhǎng)度屬性
 */
val <T> List<T>.lastItem: T
        get() = get(size - 1)
 
// 輸出:
1
2
3
4
last: 4

屬性代理

它把屬性的get()、set()代理給了一個(gè)類,以便可以在get()set()時(shí)做一些額外的操作。如:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733411.html

  • 懶加載
  • 觀察者(屬性變化時(shí),自動(dòng)發(fā)出通知)
  • 屬性非空判斷 以懶加載為例,lazySum可能需要復(fù)雜的運(yùn)算,我們把它代理給lazy。 可以看到,只有第一次加載進(jìn)行了計(jì)算,之后都是直接取值,提高了效率。 val lazySum: Int by lazy { println(“begin compute lazySum …”) var sum = 0 for (i in 0…100) sum += i println(“l(fā)azySum computed!n”) sum // 返回計(jì)算結(jié)果 } fun main(args: Array<String>) { println(lazySum) println(lazySum) } // 輸出: begin compute lazySum … lazySum computed! 5050 5050 Anko AnkoKotlin團(tuán)隊(duì)開(kāi)發(fā)的一個(gè)庫(kù),旨在簡(jiǎn)化Android開(kāi)發(fā)。其主要目標(biāo)在于提供一個(gè)DSL,使用Kotlin代碼來(lái)聲明視圖: verticalLayout { val name = editText() button(“Say Hello”) { onClick { toast(“Hello, ${name.text}!”) } } } 它還提供了其他一些很有用的特性。比如說(shuō),導(dǎo)航到其他Activity和傳值到其它界面: startActivity(“id” to res.id, “name” to res.name) startActivity<ContentActivity>( Pair(Constants.CONTENT_TITLE_KEY, useWebsiteBean.name), Pair(Constants.CONTENT_URL_KEY, useWebsiteBean.link), Pair(Constants.CONTENT_ID_KEY, useWebsiteBean.id) ) 總結(jié) Kotlin真的在很多方面都簡(jiǎn)化了Android的開(kāi)發(fā)工作。它會(huì)提升你的生產(chǎn)力,并且可以通過(guò)非常不同且更加簡(jiǎn)單的方式來(lái)解決一些常見(jiàn)的問(wèn)題。讓我們一起使用Kotlin來(lái)快速敏捷開(kāi)發(fā)吧。
    更多Kotlin 資料可以掃碼免費(fèi)領(lǐng)?。。?!
    android kotlin,kotlin,android,java

到了這里,關(guān)于Kotlin 輕量級(jí)Android開(kāi)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《Java Web輕量級(jí)整合開(kāi)發(fā)入門(mén)》學(xué)習(xí)筆記

    《Java Web輕量級(jí)整合開(kāi)發(fā)入門(mén)》學(xué)習(xí)筆記

    輕量級(jí)Java Web整合開(kāi)發(fā) 第一章 輕量級(jí)Java Web開(kāi)發(fā)概述 1.2? java web 開(kāi)發(fā)概述 1.JSP是一種編譯執(zhí)行的前臺(tái)頁(yè)面技術(shù)。對(duì)于每個(gè)JSP頁(yè)面,Web服務(wù)器都會(huì)生成一個(gè)相應(yīng)的Java文件,然后再編譯該Java文件,生成相應(yīng)的Class類型文件。在客戶端訪問(wèn)到的JSP頁(yè)面,就是相應(yīng)Class文件執(zhí)行的結(jié)果

    2024年02月08日
    瀏覽(92)
  • HarmonyOS鴻蒙應(yīng)用開(kāi)發(fā)(三、輕量級(jí)配置存儲(chǔ)dataPreferences)

    HarmonyOS鴻蒙應(yīng)用開(kāi)發(fā)(三、輕量級(jí)配置存儲(chǔ)dataPreferences)

    在應(yīng)用開(kāi)發(fā)中存儲(chǔ)一些配置是很常見(jiàn)的需求。在android中有SharedPreferences,一個(gè)輕量級(jí)的存儲(chǔ)類,用來(lái)保存應(yīng)用的一些常用配置。在HarmonyOS鴻蒙應(yīng)用開(kāi)發(fā)中,實(shí)現(xiàn)類似功能的也叫首選項(xiàng),dataPreferences。 ohos.data.preferences (用戶首選項(xiàng)) dataPreferences(首選項(xiàng)),為應(yīng)用提供Key-Value鍵

    2024年01月22日
    瀏覽(91)
  • OpenHarmony實(shí)戰(zhàn)開(kāi)發(fā)-如何實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用。

    OpenHarmony實(shí)戰(zhàn)開(kāi)發(fā)-如何實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用。

    ? 本示例使用inputMethodEngine實(shí)現(xiàn)一個(gè)輕量級(jí)輸入法應(yīng)用kikaInput,支持在運(yùn)行OpenHarmony OS的智能終端上。 使用說(shuō)明 1.使用hdc shell aa start ability -a InputMethod -b cn.openharmony.inputmethodchoosedialog命令拉起切換輸入法彈窗,點(diǎn)擊kikainput切換輸入法到當(dāng)前應(yīng)用。 2.點(diǎn)擊應(yīng)用中的編輯框,拉起

    2024年04月24日
    瀏覽(89)
  • 鴻蒙開(kāi)發(fā)實(shí)例|構(gòu)建輕量級(jí)智能穿戴設(shè)備用戶界面

    鴻蒙開(kāi)發(fā)實(shí)例|構(gòu)建輕量級(jí)智能穿戴設(shè)備用戶界面

    HarmonyOS提供了輕量級(jí)智能穿戴應(yīng)用開(kāi)發(fā),開(kāi)發(fā)者可以在運(yùn)動(dòng)手表上開(kāi)發(fā)跨設(shè)備協(xié)同工作的應(yīng)用,如從與之匹配的智能手機(jī)、平板等各類設(shè)備上獲取信息,便捷地顯示在運(yùn)動(dòng)手表上,或通過(guò)對(duì)運(yùn)動(dòng)手表的操作來(lái)控制其他設(shè)備上的操作任務(wù),為消費(fèi)者帶來(lái)更加靈活、智慧的分布式

    2024年02月03日
    瀏覽(93)
  • Kotlin開(kāi)發(fā)Android之基礎(chǔ)問(wèn)題記錄

    1、Kotlin中如何直接通過(guò)組件id來(lái)操作組件? 解決方案:在build.gradle中添加對(duì)相應(yīng)插件的使用即可。 2、Kotlin中Button設(shè)置背景顏色沒(méi)有效果。 解決方案:在res-values-themes.xml文件中修改如下代碼: 3、Kotlin中如何使用靜態(tài)類或者靜態(tài)方法? 解決方案: 4、Kotlin中EditText的賦值問(wèn)題

    2024年02月09日
    瀏覽(91)
  • Android開(kāi)發(fā)知識(shí)學(xué)習(xí)——Kotlin進(jìn)階

    Android開(kāi)發(fā)知識(shí)學(xué)習(xí)——Kotlin進(jìn)階

    申明前綴有construct修飾 如果有一個(gè)主構(gòu)造函數(shù),每個(gè)次構(gòu)造函數(shù)需要委托給主構(gòu)造函數(shù),可以直接委托或者通過(guò)別的構(gòu)造函數(shù) 主構(gòu)造函數(shù):是類頭的一部分,跟在類名后面(可帶參數(shù)),沒(méi)有任何注解和可見(jiàn)性修飾符。如: 主構(gòu)造函數(shù)中沒(méi)有任何代碼,初始化代碼放在關(guān)鍵

    2024年02月06日
    瀏覽(93)
  • HarmonyOS學(xué)習(xí)路之開(kāi)發(fā)篇—數(shù)據(jù)管理(輕量級(jí)數(shù)據(jù)存儲(chǔ))

    HarmonyOS學(xué)習(xí)路之開(kāi)發(fā)篇—數(shù)據(jù)管理(輕量級(jí)數(shù)據(jù)存儲(chǔ))

    輕量級(jí)數(shù)據(jù)存儲(chǔ)適用于對(duì)Key-Value結(jié)構(gòu)的數(shù)據(jù)進(jìn)行存取和持久化操作。應(yīng)用獲取某個(gè)輕量級(jí)存儲(chǔ)對(duì)象后,該存儲(chǔ)對(duì)象中的數(shù)據(jù)將會(huì)被緩存在內(nèi)存中,以便應(yīng)用獲得更快的數(shù)據(jù)存取速度。應(yīng)用也可以將緩存的數(shù)據(jù)再次寫(xiě)回文本文件中進(jìn)行持久化存儲(chǔ),由于文件讀寫(xiě)將產(chǎn)生不可避免

    2024年02月13日
    瀏覽(89)
  • 用go設(shè)計(jì)開(kāi)發(fā)一個(gè)自己的輕量級(jí)登錄庫(kù)/框架吧

    幾乎每個(gè)項(xiàng)目都會(huì)有登錄,退出等用戶功能,而登錄又不單僅僅是登錄,我們要考慮很多東西。 token該怎么生成?生成什么樣的? 是在Cookie存token還是請(qǐng)求頭存token?讀取的時(shí)候怎么讀?。?允許同一個(gè)賬號(hào)被多次登錄嗎?多次登錄他們的token是一樣的?還是不一樣的? 登錄也

    2024年02月03日
    瀏覽(91)
  • 輕量級(jí)web開(kāi)發(fā)框架:Flask本地部署及實(shí)現(xiàn)公網(wǎng)訪問(wèn)界面

    輕量級(jí)web開(kāi)發(fā)框架:Flask本地部署及實(shí)現(xiàn)公網(wǎng)訪問(wèn)界面

    本篇文章講解如何在本地安裝Flask,以及如何將其web界面發(fā)布到公網(wǎng)上并進(jìn)行遠(yuǎn)程訪問(wèn)。 Flask是目前十分流行的web框架,采用Python編程語(yǔ)言來(lái)實(shí)現(xiàn)相關(guān)功能。較其他同類型框架更為靈活、輕便、安全且容易上手。它可以很好地結(jié)合MVC模式進(jìn)行開(kāi)發(fā),開(kāi)發(fā)人員分工合作,小型團(tuán)

    2024年02月05日
    瀏覽(147)
  • 擁抱創(chuàng)新:用Kotlin開(kāi)發(fā)高效Android應(yīng)用

    擁抱創(chuàng)新:用Kotlin開(kāi)發(fā)高效Android應(yīng)用

    在當(dāng)今數(shù)字時(shí)代,移動(dòng)應(yīng)用已經(jīng)成為人們生活中不可或缺的一部分。無(wú)論是社交媒體、電子商務(wù)還是健康管理,移動(dòng)應(yīng)用已經(jīng)深刻地影響了我們的生活方式。隨著移動(dòng)設(shè)備的普及和功能的增強(qiáng),Android平臺(tái)作為最大的移動(dòng)操作系統(tǒng)之一,扮演著舉足輕重的角色。然而,隨著用戶

    2024年02月14日
    瀏覽(95)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包