Skip to content

Commit 3ecdddc

Browse files
committed
update
1 parent 1d0e7b4 commit 3ecdddc

17 files changed

+184
-75
lines changed

app/build.gradle.kts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
import org.jetbrains.kotlin.utils.addToStdlib.butIf
2+
13
@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
24
plugins {
35
alias(libs.plugins.androidApp)
46
alias(libs.plugins.kotlin.android)
57
alias(libs.plugins.kotlin.serialization)
8+
alias(libs.plugins.kotlin.parcelize)
69
}
710

811
android {
@@ -62,6 +65,8 @@ dependencies {
6265
implementation(libs.ui.graphics)
6366
implementation(libs.ui.tooling.preview)
6467
implementation(libs.material3)
68+
implementation(libs.bom.foundation)
69+
implementation(libs.bom.runtime)
6570

6671
implementation(libs.androidx.navigation.compose)
6772

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<category android:name="android.intent.category.LAUNCHER" />
2222
</intent-filter>
2323
</activity>
24-
<activity android:name="com.wzq.jd.compose.app.WebActivity" />
24+
<activity android:name="com.wzq.jd.compose.app.page.WebActivity" />
2525
</application>
2626

2727
</manifest>

app/src/main/java/com/wzq/jd/compose/app/MainActivity.kt

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ import androidx.compose.ui.tooling.preview.Preview
1717
import androidx.navigation.compose.NavHost
1818
import androidx.navigation.compose.composable
1919
import androidx.navigation.compose.rememberNavController
20-
import androidx.navigation.navArgument
20+
import com.wzq.jd.compose.app.data.model.Categories
21+
import com.wzq.jd.compose.app.page.PageRouter
2122
import com.wzq.jd.compose.app.page.WebPage
2223
import com.wzq.jd.compose.app.page.main.CategoriesDetailPage
2324
import com.wzq.jd.compose.app.page.main.MainPage
@@ -44,8 +45,7 @@ class MainActivity : ComponentActivity() {
4445
@Composable
4546
fun Greeting(name: String) {
4647
val navController = rememberNavController()
47-
NavHost(
48-
navController = navController,
48+
NavHost(navController = navController,
4949
startDestination = "main",
5050
route = name,
5151
enterTransition = {
@@ -54,17 +54,14 @@ fun Greeting(name: String) {
5454
exitTransition = { fadeOut() },
5555
popEnterTransition = { fadeIn() },
5656
popExitTransition = { slideOutHorizontally { it } }) {
57-
composable("main") { MainPage(navController) }
58-
composable("search") { SearchPage(navController = navController) }
59-
composable(
60-
"web?url={url}", arguments = listOf(navArgument("url") { defaultValue = "" })
61-
) {
57+
composable(PageRouter.Main.name) { MainPage(navController) }
58+
composable(PageRouter.Search.name) { SearchPage(navController = navController) }
59+
composable(PageRouter.Web.name, PageRouter.Web.args) {
6260
WebPage(navController, it.arguments?.getString("url"))
6361
}
64-
composable("categories") {
62+
composable(PageRouter.Categories.name) {
6563
CategoriesDetailPage(
66-
navController = navController,
67-
categories = navController.previousBackStackEntry?.savedStateHandle?.get("categories")
64+
navController = navController
6865
)
6966
}
7067
}

app/src/main/java/com/wzq/jd/compose/app/PageRouter.kt

Lines changed: 0 additions & 7 deletions
This file was deleted.

app/src/main/java/com/wzq/jd/compose/app/data/RemoteDataRepo.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.wzq.jd.compose.app.data
22

33
import com.wzq.jd.compose.app.data.model.ArticleItem
4-
import com.wzq.jd.compose.app.data.model.KnowledgeCategories
4+
import com.wzq.jd.compose.app.data.model.Categories
55
import com.wzq.jd.compose.app.data.model.NetResult
66
import com.wzq.jd.compose.app.data.model.PagingResult
77
import com.wzq.jd.compose.app.data.model.SearchHotWords
@@ -38,7 +38,7 @@ class RemoteDataRepo(private val httpClient: HttpClient, private val baseUrl: St
3838

3939
suspend fun getKnowledgeCategories() = runCatching {
4040
httpClient.get("${baseUrl}tree/json")
41-
.body<NetResult<List<KnowledgeCategories>>>()
41+
.body<NetResult<List<Categories>>>()
4242
}.onFailure(defaultErrorHandler)
4343

4444

app/src/main/java/com/wzq/jd/compose/app/data/model/ArticleItem.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.wzq.jd.compose.app.data.model
22

3+
import android.os.Parcelable
4+
import kotlinx.parcelize.Parcelize
35
import kotlinx.serialization.Serializable
46

7+
@Parcelize
58
@Serializable
69
data class ArticleItem(
710
val adminAdd: Boolean,
@@ -39,4 +42,4 @@ data class ArticleItem(
3942
val userId: Int,
4043
val visible: Int,
4144
val zan: Int
42-
)
45+
) : Parcelable

app/src/main/java/com/wzq/jd/compose/app/data/model/KnowledgeCategories.kt renamed to app/src/main/java/com/wzq/jd/compose/app/data/model/Categories.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package com.wzq.jd.compose.app.data.model
22

3+
import android.os.Parcelable
4+
import kotlinx.parcelize.Parcelize
35
import kotlinx.serialization.Serializable
46

7+
@Parcelize
58
@Serializable
6-
data class KnowledgeCategories(
9+
data class Categories(
710
val articleList: List<ArticleItem>,
811
val author: String,
9-
val children: List<KnowledgeCategories>,
12+
val children: List<Categories>,
1013
val courseId: Int,
1114
val cover: String,
1215
val desc: String,
@@ -19,4 +22,4 @@ data class KnowledgeCategories(
1922
val type: Int,
2023
val userControlSetTop: Boolean,
2124
val visible: Int
22-
)
25+
) : Parcelable
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.wzq.jd.compose.app.page
2+
3+
import androidx.core.os.bundleOf
4+
import androidx.navigation.NamedNavArgument
5+
import androidx.navigation.NavController
6+
import androidx.navigation.NavType
7+
import androidx.navigation.navArgument
8+
9+
/**
10+
* create by wzq on 2023/11/27
11+
*
12+
*/
13+
sealed class PageRouter(val name: String, val args: List<NamedNavArgument> = emptyList()) {
14+
data object Main : PageRouter("main")
15+
16+
data object Web :
17+
PageRouter("web?url={url}", listOf(navArgument("url") { defaultValue = "" })) {
18+
fun navigation(navController: NavController, url: String) {
19+
navController.navigate("web?url=${url}")
20+
}
21+
}
22+
23+
data object Search : PageRouter("search")
24+
25+
data object Categories :
26+
PageRouter("categories") {
27+
fun navigation(id: Int) = "categories/${id}"
28+
}
29+
}
30+
31+
fun NavController.pageNavigate(name: String, vararg params: Pair<String, Any?>) {
32+
graph.findNode(name)?.id?.also {
33+
navigate(it, bundleOf(*params))
34+
}
35+
}

app/src/main/java/com/wzq/jd/compose/app/WebActivity.kt renamed to app/src/main/java/com/wzq/jd/compose/app/page/WebActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.wzq.jd.compose.app
1+
package com.wzq.jd.compose.app.page
22

33
import android.content.Context
44
import android.content.Intent
Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,92 @@
11
package com.wzq.jd.compose.app.page.main
22

3+
import androidx.compose.foundation.ExperimentalFoundationApi
4+
import androidx.compose.foundation.background
35
import androidx.compose.foundation.layout.Column
46
import androidx.compose.foundation.layout.fillMaxSize
57
import androidx.compose.foundation.layout.padding
8+
import androidx.compose.foundation.pager.HorizontalPager
9+
import androidx.compose.foundation.pager.rememberPagerState
10+
import androidx.compose.material.icons.Icons
11+
import androidx.compose.material.icons.filled.ArrowBack
12+
import androidx.compose.material3.CenterAlignedTopAppBar
13+
import androidx.compose.material3.ExperimentalMaterial3Api
14+
import androidx.compose.material3.Icon
15+
import androidx.compose.material3.IconButton
16+
import androidx.compose.material3.MaterialTheme
617
import androidx.compose.material3.ScrollableTabRow
718
import androidx.compose.material3.Tab
819
import androidx.compose.material3.Text
920
import androidx.compose.runtime.Composable
10-
import androidx.compose.runtime.getValue
11-
import androidx.compose.runtime.mutableIntStateOf
21+
import androidx.compose.runtime.derivedStateOf
1222
import androidx.compose.runtime.remember
13-
import androidx.compose.runtime.setValue
23+
import androidx.compose.runtime.rememberCoroutineScope
1424
import androidx.compose.ui.Modifier
1525
import androidx.compose.ui.unit.dp
1626
import androidx.navigation.NavController
17-
import com.wzq.jd.compose.app.data.model.KnowledgeCategories
27+
import kotlinx.coroutines.launch
1828

1929
/**
2030
* create by wzq on 2023/12/11
2131
*
2232
*/
33+
@OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class)
2334
@Composable
24-
fun CategoriesDetailPage(navController: NavController, categories: List<KnowledgeCategories>?) {
25-
if (categories.isNullOrEmpty()) {
35+
fun CategoriesDetailPage(
36+
navController: NavController,
37+
viewModel: CategoriesDetailViewModel = androidx.lifecycle.viewmodel.compose.viewModel()
38+
) {
39+
val dataList = viewModel.categories?.children
40+
if (dataList.isNullOrEmpty()) {
2641
return
2742
}
28-
var currentSelectedIndex by remember {
29-
mutableIntStateOf(0)
43+
44+
val pagerState = rememberPagerState(initialPage = viewModel.initPosition) { dataList.size }
45+
val currentSelectedIndex = remember {
46+
derivedStateOf { pagerState.currentPage }
3047
}
31-
Column(modifier = Modifier.fillMaxSize()) {
48+
val scope = rememberCoroutineScope()
49+
50+
Column(
51+
modifier = Modifier
52+
.fillMaxSize()
53+
.background(color = MaterialTheme.colorScheme.background)
54+
) {
55+
CenterAlignedTopAppBar(
56+
title = {
57+
Text(text = viewModel.categories.name, maxLines = 1)
58+
},
59+
navigationIcon = {
60+
IconButton(onClick = {
61+
navController.navigateUp()
62+
}) {
63+
Icon(Icons.Default.ArrowBack, null)
64+
}
65+
})
3266
ScrollableTabRow(
33-
selectedTabIndex = currentSelectedIndex,
67+
selectedTabIndex = currentSelectedIndex.value,
3468
edgePadding = 0.dp,
3569
divider = {}) {
36-
categories.forEachIndexed { index, knowledgeCategories ->
70+
dataList.forEachIndexed { index, knowledgeCategories ->
3771
Tab(
38-
selected = currentSelectedIndex == index,
39-
onClick = { currentSelectedIndex = index }) {
72+
selected = currentSelectedIndex.value == index,
73+
onClick = {
74+
scope.launch { pagerState.scrollToPage(index) }
75+
}) {
4076
Text(text = knowledgeCategories.name, modifier = Modifier.padding(8.dp))
4177
}
4278
}
4379

4480
}
81+
HorizontalPager(
82+
state = pagerState,
83+
beyondBoundsPageCount = 3
84+
) { page ->
85+
// LazyColumn(content = {
86+
// })
87+
88+
Text(text = "item - >$page")
89+
}
90+
4591
}
4692
}

0 commit comments

Comments
 (0)