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

Android AGP8.1.0組件化初探

這篇具有很好參考價值的文章主要介紹了Android AGP8.1.0組件化初探。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android AGP8.1.0組件化初探

Android AGP8.1.0組件化初探,android

前言:

前面兩篇完成了從AGP4.2到 AGP8.1.0的升級,本文是由于有哥們留言說在AGP8.0中使用ARouter組件化有問題,于是趁休息時間嘗試了一下,寫了幾個demo,發(fā)現(xiàn)都沒有問題,跳轉(zhuǎn)和傳值都是正常的,這里我也是直接從groovy轉(zhuǎn)換成version-catalogs的依賴方式,由于之前升級過,所以這次很順利,幾分鐘就完成了,直接上代碼:

1.添加統(tǒng)一依賴:

[versions]
agp = "8.1.0"
androidx-espresso-core = "3.4.0"
androidx-junit = "1.1.3"
org-jetbrains-kotlin-android = "1.8.0"
core-ktx = "1.10.1"
junit = "4.13.2"
androidx-test-ext-junit = "1.1.5"
espresso-core = "3.5.1"
appcompat = "1.6.1"
material = "1.9.0"
constraintlayout = "2.1.4"
mmkv = "1.3.1"
utilcodex = "1.31.1"
arouter = "1.5.2"
arouter-compiler = "1.5.2"
org-jetbrains-kotlin-kapt = "1.8.0"

[libraries]
androidx-espresso-core-3_4_0 = { module = "androidx.test.espresso:espresso-core", version.ref = "androidx-espresso-core" }
androidx-junit-1_1_3 = { module = "androidx.test.ext:junit", version.ref = "androidx-junit" }
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-test-ext-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidx-test-ext-junit" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
constraintlayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "constraintlayout" }
mmkv = { group = "com.tencent", name = "mmkv", version.ref = "mmkv" }
utilcodex = {group = "com.blankj",name = "utilcodex",version.ref = "utilcodex"}
arouter = {group = "com.alibaba",name = "arouter-api",version.ref = "arouter"}
arouter-compiler = {group = "com.alibaba",name = "arouter-compiler",version.ref = "arouter-compiler"}

[plugins]
com-android-library = { id = "com.android.library", version.ref = "agp" }
com-android-application = { id = "com.android.application", version.ref = "agp" }
org-jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "org-jetbrains-kotlin-android" }
org-jetbrains-kotlin-kapt = {id = "org.jetbrains.kotlin.kapt",version.ref = "org-jetbrains-kotlin-kapt"}

[bundles]

2.添加lib-common組件配置:

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.com.android.library)
    alias(libs.plugins.org.jetbrains.kotlin.android)
    alias(libs.plugins.org.jetbrains.kotlin.kapt)
}
dependencies {
    implementation(libs.core.ktx)
    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.arouter)
    kapt(libs.arouter.compiler)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.espresso.core)
}

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.name)
    }
}

完整配置:

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.com.android.library)
    alias(libs.plugins.org.jetbrains.kotlin.android)
    alias(libs.plugins.org.jetbrains.kotlin.kapt)
}

android {
    namespace = "com.example.lib_cmmon"
    compileSdk = 33

    defaultConfig {
        //applicationId = "com.example.lib_cmmon"
        minSdk = 23
        targetSdk = 33
       // versionCode = 1
       // versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

dependencies {
    implementation(libs.core.ktx)
    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.arouter)
    kapt(libs.arouter.compiler)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.espresso.core)
}

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.name)
    }
}

3.lib-common添加ARouter初始化:

/**
 * @author: njb
 * @date: 2023/8/26 22:21
 * @desc:
 */
public class BaseApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        initARouter();
    }

    private void initARouter() {
        ARouter.openDebug();
        ARouter.openLog();
        ARouter.init(this);
    }
}

4.添加lib-arouter組件配置:

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.com.android.library)
    alias(libs.plugins.org.jetbrains.kotlin.android)
    alias(libs.plugins.org.jetbrains.kotlin.kapt)
}

android {
    namespace = "com.example.lib_arouter"
    compileSdk = 33

    defaultConfig {
       // applicationId = "com.example.lib_arouter"
        minSdk = 23
        targetSdk = 33
        //versionCode = 1
       // versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

dependencies {

    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.constraintlayout)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.espresso.core)
    implementation(libs.arouter)
    kapt(libs.arouter.compiler)
    implementation(project(":lib-common"))
}

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.name)
    }
}

5.調(diào)用ARouter初始化:

/**
 * @author: njb
 * @date: 2023/8/26 22:21
 * @desc:
 */
public class ARouterApp  extends BaseApp {

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

6.主模塊依賴配置:

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.com.android.application)
    alias(libs.plugins.org.jetbrains.kotlin.android)
    alias(libs.plugins.org.jetbrains.kotlin.kapt)
}

android {
    namespace =  "com.example.writelogdemo"
    compileSdk = 33

    defaultConfig {
        applicationId  = "com.example.writelogdemo"
        minSdk = 23
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"

        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

dependencies {
    implementation(libs.core.ktx)
    implementation(libs.appcompat)
    implementation(libs.material)
    implementation(libs.constraintlayout)
    testImplementation(libs.junit)
    androidTestImplementation(libs.androidx.test.ext.junit)
    androidTestImplementation(libs.espresso.core)
    implementation(libs.utilcodex)
    implementation(libs.arouter)
    kapt(libs.arouter.compiler)
    implementation(project(":lib-arouter"))
    implementation(project(":lib-common"))
}


7.添加ARouter組件化配置:

7.1 引入ARouter依賴:

這里我用的是catelog方式,所以使用kapt方式

@Suppress("DSL_SCOPE_VIOLATION")
plugins {
    alias(libs.plugins.com.android.library)
    alias(libs.plugins.org.jetbrains.kotlin.android)
    alias(libs.plugins.org.jetbrains.kotlin.kapt)
}

implementation(libs.arouter)
kapt(libs.arouter.compiler)

7.2 添加模塊名稱配置:

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.name)
    }
}

7.3 主模塊ARouter初始化:

/**
 * @author: njb
 * @date: 2023/8/25 22:36
 * @desc:
 */
public class LogApp extends BaseApp {
    private static LogApp mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static LogApp getInstance() {
        return mInstance;
    }
}

7.4 在Activity中綁定Arouter:

ARouter.getInstance().inject(this)

7.5 添加Arouter跳轉(zhuǎn)和傳值:

userList = arrayListOf("年齡18","John","身高180","體重60kg","性別female")
tvText.setOnClickListener {
    ARouter.getInstance().build("/test/TestSplashActivity").withString("name","test張三").withSerializable("userList",
        userList
    ).navigation()

7.6 test模塊添加跳轉(zhuǎn)路徑和數(shù)據(jù)接收:

@Route(path = "/test/TestSplashActivity")
class TestSplashActivity : AppCompatActivity() {
    val TAG = "TestARouter"

    @Autowired(name = "name")
    @JvmField
    var name: String = ""

    @Autowired(name = "userList")
    @JvmField
    var mList:ArrayList<String> ?= null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_splash)
        ARouter.getInstance().inject(this)

        initView()
    }

    private fun initView() {
        tvName.text = "測試ARouter跳轉(zhuǎn)$name"
        tvTextView.text = mList.toString()
    }
}

8.完整使用示例:

package com.example.writelogdemo

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import com.alibaba.android.arouter.launcher.ARouter

class MainActivity : AppCompatActivity() {
    private val tvText : TextView by lazy { findViewById(R.id.tvTest) }
    var userList:ArrayList<String> ?= null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ARouter.getInstance().inject(this)
        userList = arrayListOf("年齡18","John","身高180","體重60kg","性別female")
        tvText.setOnClickListener {
            ARouter.getInstance().build("/test/TestSplashActivity").withString("name","test張三").withSerializable("userList",
                userList
            ).navigation()
        }
    }
}

9.主模塊布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

10.lib-arouter測試代碼:

package com.example.lib_arouter

import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.alibaba.android.arouter.facade.annotation.Autowired
import com.alibaba.android.arouter.facade.annotation.Route
import com.alibaba.android.arouter.launcher.ARouter

@SuppressLint("CustomSplashScreen")
@Route(path = "/test/TestSplashActivity")
class TestSplashActivity : AppCompatActivity() {
    val TAG = "TestARouter"
    val tvName:TextView by lazy { findViewById(R.id.tv_name) }
    val tvTextView:TextView by lazy { findViewById(R.id.tv_test) }
    @Autowired(name = "name")
    @JvmField
    var name: String = ""

    @Autowired(name = "userList")
    @JvmField
    var mList:ArrayList<String> ?= null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_test_splash)
        ARouter.getInstance().inject(this)
        Log.d(TAG, "測試ARouter數(shù)據(jù)傳遞$name$mList")
        initView()
    }

    private fun initView() {
        tvName.text = name
        tvTextView.text = mList.toString()
    }
}

11.lib-arouter布局代碼:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TestSplashActivity">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="這是Arouter測試"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="這是數(shù)組"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_name" />

</androidx.constraintlayout.widget.ConstraintLayout>

12.日志打印如下:

Android AGP8.1.0組件化初探,android

Android AGP8.1.0組件化初探,android

13.實現(xiàn)效果如下:

Android AGP8.1.0組件化初探,android

Android AGP8.1.0組件化初探,android

14.遇到問題:

14.1 測試模塊配置不對

由于我是直接新建的模塊,所以當(dāng)作完整項目配置的,這里如果只是測試組件化需要修改配置

Android AGP8.1.0組件化初探,android

解決方法修改libs.plugins.com.android.application為libs.plugins.com.android.library
Android AGP8.1.0組件化初探,android

修改完成后可以正常運行:

14.2 跳轉(zhuǎn)時提示path找不到

解決方法:
a.按照上面7中的步驟配置主模塊和其他組件模塊,一個都不能少。

?b.同時在跳轉(zhuǎn)時保證路徑一致即可。

若配置完還有問題,請仔細(xì)檢查每一步,直到正常跳轉(zhuǎn)和數(shù)據(jù)傳遞,本人是親自嘗試了多個項目,基本上都沒問題.

14.3 數(shù)據(jù)傳遞和接收問題

Android AGP8.1.0組件化初探,android

解決方法:

a.在kotlin中使用ARouter接收數(shù)據(jù)時需要使用@JvmField關(guān)鍵字

b.@Autowired(name = “name”),name一定要和傳遞時一致

c.傳遞數(shù)組時記得序列化,接收也是一樣

15.AGP8.1.0小技巧:

15.1 在沒有添加統(tǒng)一依賴時配置:

implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
implementation("com.alibaba:arouter-api:1.5.2")
kapt("com.alibaba:arouter-compiler:1.5.2")
implementation(project(":lib-common"))

15.2 添加統(tǒng)一依賴庫配置后:

如果添加了統(tǒng)一的catelog配置方式后導(dǎo)入依賴它會自動提示,不需要開發(fā)者手動導(dǎo)入,這點我感覺很爽,一鍵一直替換,用起來簡直不要太安逸了,感興趣的同學(xué)可以自行嘗試,這里就簡單舉例。
Android AGP8.1.0組件化初探,android
Android AGP8.1.0組件化初探,android

16.總結(jié):

以上就是今天博客的內(nèi)容在AGP8.1.0中使用組件化和遇到問題,其實本文的目的不是在于如何使用,ARouter這個很簡單,相信做過組件化的同學(xué)都會,只是需要遇到問題時學(xué)會分析和調(diào)試,要不然盲目猜測是不會有結(jié)果的。開發(fā)這條路任重而道遠(yuǎn),希望大家都能上下求索,享受這個求索的過程,痛并快樂著,也很重要,新技術(shù)出來可以嘗試,也可以根據(jù)自己需要調(diào)整,不一樣說非得更新用這個新技術(shù),只要能解決問題,咋好用咋來。

17.demo地址如下:

https://gitee.com/jackning_admin/write-log-demo文章來源地址http://www.zghlxwxcb.cn/news/detail-684615.html

到了這里,關(guān)于Android AGP8.1.0組件化初探的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Android】從零搭建組件化項目

    【Android】從零搭建組件化項目

    組件化系列文章介紹的內(nèi)容稍微多了點,本著研究透這玩意的精神,從組件化的簡介開始說起。 什么是組件化? 將多個功能模板拆分、重組的過程。 為什么要使用組件化? 1、加快編譯速度,提高開發(fā)效率,增強可維護(hù)性、移植性。 2、高內(nèi)聚(軟件模塊是由相關(guān)性很強的代

    2024年02月15日
    瀏覽(21)
  • Android徹底組件化—UI跳轉(zhuǎn)升級改造

    Android徹底組件化—UI跳轉(zhuǎn)升級改造

    (2)host對應(yīng)的是share。在組件化框架中,每個組件對應(yīng)一個唯一的host,例如分享組件的host就是share,讀書組件的host是reader等等。 host是路由分發(fā)的第一級,根據(jù)host可以定位到每個組件。 host還可以對所有的路由URL進(jìn)行一個分組,只有調(diào)用到該分組的路由的時候,組內(nèi)的路由

    2024年04月16日
    瀏覽(21)
  • Android學(xué)習(xí)之路(22) 從模塊化到組件化

    Android學(xué)習(xí)之路(22) 從模塊化到組件化

    Android 應(yīng)用項目 , 都存在一個應(yīng)用模塊 ( Application Module ) , 在 build.gradle 構(gòu)建腳本中 , 第一個插件配置 com.android.application , 表明 該 Module 編譯打包后的輸出是 APK 安裝包 ; 該項目可以直接運行 ; 如果在 build.gradle 配置的是 com.android.library 插件 , 那么 編譯 Module 打包后輸出的是 a

    2024年01月22日
    瀏覽(23)
  • Android學(xué)習(xí)之路(23)組件化框架ARouter的使用

    Android學(xué)習(xí)之路(23)組件化框架ARouter的使用

    支持直接解析標(biāo)準(zhǔn)URL進(jìn)行跳轉(zhuǎn),并自動注入?yún)?shù)到目標(biāo)頁面中 支持多模塊工程使用 支持添加多個攔截器,自定義攔截順序 支持依賴注入,可單獨作為依賴注入框架使用 支持InstantRun 支持MultiDex (Google方案) 映射關(guān)系按組分類、多級管理,按需初始化 支持用戶指定全局降級與局

    2024年01月22日
    瀏覽(25)
  • 現(xiàn)代化 Android 開發(fā):組件化與模塊化的抉擇

    作者:古哥E下 項目初始的時候,一般都是使用一個分層架構(gòu),接入各種框架,然后就寫業(yè)務(wù)代碼。但如果項目慢慢變大,那就會出現(xiàn)很多項目管理的問題,諸如: 1.代碼復(fù)用與抽象問題 2.編譯速度問題 3.版本迭代速度問題 所以組件化、模塊化、動態(tài)化、插件化、跨平臺等各

    2024年02月11日
    瀏覽(26)
  • Android組件化方案及組件消息總線modular-event實戰(zhàn),渣本Android開發(fā)小伙如何一步步成為架構(gòu)師

    Android組件化方案及組件消息總線modular-event實戰(zhàn),渣本Android開發(fā)小伙如何一步步成為架構(gòu)師

    美團(tuán)外賣團(tuán)隊開發(fā)的一款A(yù)ndroid路由框架,基于組件化的設(shè)計思路。主要提供路由、ServiceLoader兩大功能。之前美團(tuán)技術(shù)博客也發(fā)表過一篇WMRouter的介紹:《WMRouter:美團(tuán)外賣Android開源路由框架》。WMRouter提供了實現(xiàn)組件化的兩大基礎(chǔ)設(shè)施框架:路由和組件間接口調(diào)用。支持和文

    2024年04月22日
    瀏覽(16)
  • Android技術(shù)棧(二)組件化改造,目前最穩(wěn)定和高效的UI適配方案

    Android技術(shù)棧(二)組件化改造,目前最穩(wěn)定和高效的UI適配方案

    .build(PR.navi.navi) .navigation(); 而 Activity 則不需要,它會立即顯示 ARouter.getInstance() .build(PR.navi.navi) //還可以設(shè)置參數(shù),ARouter會幫你存在Bundle中 .withString(“pathId”,UUID.randomUUID().toString()) //Activity 或 Context .navigation(this); navi 模塊是典型的業(yè)務(wù)邏輯模塊,這里你可導(dǎo)入一些只有這個模塊才

    2024年03月24日
    瀏覽(21)
  • 一篇讀懂 Android 開發(fā)中模塊化、組件化、插件化和熱修復(fù)

    一篇讀懂 Android 開發(fā)中模塊化、組件化、插件化和熱修復(fù)

    網(wǎng)上關(guān)于 “Android 開發(fā)\\\" 的文章很多,我本人學(xué)習(xí) Android 開發(fā)的過程也借鑒了網(wǎng)上先輩們的文章;但大多數(shù)文章都從底層的細(xì)枝末節(jié)開始講述,由下而上給人一種這門技術(shù)“博大精深”望而生畏的感覺;而我寫這篇文章的初衷就是由上而下,希望別人在閱讀的過程中能夠覺得

    2023年04月08日
    瀏覽(23)
  • 大型Android項目架構(gòu):基于組件化+模塊化+Kotlin+協(xié)程+Flow+Retrofit+Jetpack+MVVM架構(gòu)實現(xiàn)WanAndroid客戶端

    大型Android項目架構(gòu):基于組件化+模塊化+Kotlin+協(xié)程+Flow+Retrofit+Jetpack+MVVM架構(gòu)實現(xiàn)WanAndroid客戶端

    前言:茍有恒,何必三更眠五更起;最無益,莫過一日曝十日寒。 之前一直想寫個 WanAndroid 項目來鞏固自己對 Kotlin+Jetpack+協(xié)程 等知識的學(xué)習(xí),但是一直沒有時間。這里重新行動起來,從項目搭建到完成前前后后用了兩個月時間,平常時間比較少,基本上都是只能利用零碎的

    2024年02月09日
    瀏覽(27)
  • 組件化開發(fā)之如何封裝組件-react

    組件是構(gòu)建用戶界面的基本單元,它是一個獨立的、可重用的、可組合的代碼單元,用于表示UI的一部分。 人話:當(dāng)談?wù)摻M件時,就像在搭積木一樣,每個組件都是一個 獨立的、可以重復(fù)使用 的代碼塊,用來構(gòu)建網(wǎng)頁或應(yīng)用的各個部分。比如界面的布局,像按鈕、文本輸入

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包