哪个网站专门做快餐车,网站入口模板,aso优化app推广,门户网站建设报价创建Screents和ViewModels
在前面的章节中#xff0c;我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。
在本章中#xff0c;我们将开始实现初始结构和模板#xff0c;这将联接每一个应用程序的部分。
首先将添加以下带有各自视图模型的主屏幕#xff1a;
•…创建Screents和ViewModels
在前面的章节中我们已经分析了OrderNow项目的理论概念和我们将赋予的组织。
在本章中我们将开始实现初始结构和模板这将联接每一个应用程序的部分。
首先将添加以下带有各自视图模型的主屏幕
• 首页
• 产品列表
• 产品详情
• 购物车
添加元素的一个例子如下图所示
Sreens 和 ViewModels 我们将在应用程序中使用依赖管理器将每个ViewModel绑定到各自的屏幕上。为此我们必须首先在应用程序中依赖Hilt。 implementation com.google.dagger:hilt-android:2.38.1 // Use the latest version
kapt com.google.dagger:hilt-android-compiler:2.38.1 // Use the latest version 在依赖Hilt的过程后将要求定义应用类型类例如在我们的示例项目中将定义为OrderNowApplication如下 HiltAndroidApp
class OrderNowApplication:Application() {
} 注意在androidmanifest .xml中注册OrderNowApplication类 application android:name.main.OrderNowApplication android:allowBackuptrue ... 此外我们将 Navigation Compose依赖到项目中这将允许View(Composable)在导航期间获得其各自ViewModel的实例: dependencies { implementation androidx.hilt:hilt-navigation-compose:1.0.0 } 一旦在项目中正确地执行了前面的配置我们就可以像这样将ViewModel注入View: Home ViewModel: HiltViewModel class HomeViewModel Inject constructor() : ViewModel() { ... } Home Screen: Composable fun HomeScreen(viewModel: HomeViewModel hiltViewModel() ) { ... } 每个屏幕都将通过Hilt依赖管理器与其相应的ViewModel相关联。到目前为止我们已经集成了以下架构组件:Compose、Navigation和ViewModel。
这是Jetpack工具的完美组合在后面的章节中我们将看到它在移动开发中的潜力。 UI模式TopAppBar和BottomAppBar
通过Scaffold组件我们可以在应用程序中实现两种在Material Design中最常见的UI模式TopAppBar和BottomAppBar。
Scaffold是一个详细的视图composable它将允许我们以以下方式实现这些模式
Scaffold: Scaffold( topBar { TopAppBar { /* Top app bar content */ } }, bottomBar { BottomAppBar { /* Bottom app bar content */ } } ) { contentPadding - 9 // Screen content } 在代码片段中我们定义了topBarbottomBar和还未添加的屏幕内容。
在Scaffold中topBar和bottomBar部分是可选的也就是说可以省略其中一部分的定义。此外在Scaffold中我们可以声明两个更多的组件
• scaffoldState
• snackbarHost
在下一章我们将看到每个的用法。现在我们只定义topBar和bottomBar。 现在我们知道如何在我们的应用程序中包含这些UI模式下一步就是创建代表TopAppBar和BottomAppBar的视图Composables。
我们将其组织在一个叫做patterns的目录中并在其中添加了两个ViewsOrderNowTopBar和OrderNowBottomBar如下所示
TopAppBar and BottomAppBar Composables: OrderNowTopBar
OrderNowTopBar的实现很简单。我们最初只需要以以下方式实现它: Composable fun OrderNowTopBar() { TopAppBar( title { Text( text stringResource(id AppString.app_name), textAlign TextAlign.Center, modifier Modifier.fillMaxWidth() ) }, backgroundColor MaterialTheme.colors.background, contentColor contentColorFor(MaterialTheme.colors.background) ) } 之前的实现还不包含返回选项等元素;然而在后面的章节中添加“Back”到TopAppBar中它将包含这样一个使用状态策略的导航选项。
OrderNowBottomBar
OrderNowBottomBar的实现可以更精细一些因为我们需要包括屏幕之间的导航。但是我们将把实现细节留到下一章。
现在我们将包含一个没有导航的静态定义。
Composable
fun OrderNowBottomBar() {val selectedIndex remember { mutableStateOf(0) }BottomNavigation(backgroundColor MaterialTheme.colors.background,contentColor contentColorFor(MaterialTheme.colors.background),elevation 10.dp) {BottomNavigationItem(icon {Icon(imageVector Icons.Default.Home, )},label { Text(text Home) },selected (selectedIndex.value 0),unselectedContentColor Color.Gray,selectedContentColor orange,onClick {selectedIndex.value 0})BottomNavigationItem(icon {Icon(imageVector Icons.Default.ShoppingCart, )},label { Text(text Cart) },selected (selectedIndex.value 1),unselectedContentColor Color.Gray,selectedContentColor orange,onClick {selectedIndex.value 1})}
}
在这个阶段我们已经有了屏幕、视图模型和Scaffold的定义其中包括OrderNowBottomBar和OrderNowTopBar。
下一步是将所有的部分组合在一起我们将在下一部分中做这个。
将所有元素整合在一起
第一项任务是创建一个名为main的目录。这个目录将是横向的并将包含App的基类或结构。
在该目录中我们放置Application类移动MainActivity到那里以及应用程序的主屏幕我们将其命名为OrderNowScreen如下图所示。
Main Components 现在我们修改MainActivity.kt类以便它将登录屏幕加载到OrderNowScreen应用程序如下所示:
AndroidEntryPoint
class MainActivity : ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {OrderNowScreen()}}
}然后在OrderNowScreen视图中我们像这样定义应用程序的Scaffold:
Composable
fun OrderNowScreen() {InitialSkeletonTheme {Surface(modifier Modifier.fillMaxSize(),color MaterialTheme.colors.background) {Scaffold(topBar { OrderNowTopBar() },bottomBar { OrderNowBottomBar() }) { contentPadding -println(contentPadding)}}}
}当您运行应用程序时结果应该类似于以下图像: 总结
在本章中我们已经构建了OrderNow项目的初始结构。
这里定义和实现的组件将是下一章继续讨论导航的基础。
随着我们阅读这些章节我们将改进OrderNow的每个部分的实现因此.我们的电子贸易将以最佳方式设计和实施。
源码
class MainActivity4: ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent{OrderNowScreen()}}
}
Preview
Composable
fun OrderNowScreen() {MyTestTheme {Surface(modifier Modifier.fillMaxSize(),colorMaterialTheme.colors.background){Scaffold(topBar {OrderNowTopBar()},bottomBar{ OrderNowBottomBar()}) {contentPadding -println(contentPadding)}}}
}Preview
Composable
fun OrderNowBottomBar(){val selectedIndex remember{ mutableStateOf(0)}BottomNavigation(backgroundColor MaterialTheme.colors.background,contentColorcontentColorFor(MaterialTheme.colors.background),elevation 10.dp){BottomNavigationItem(icon { Icon(imageVector Icons.Default.Home,) },label { Text(text 首页)},selected (selectedIndex.value 0) ,unselectedContentColor Color.Gray,selectedContentColor Color.Red,onClick { selectedIndex.value 0 })BottomNavigationItem(icon{Icon(imageVector Icons.Default.Favorite,)},label {Text(text热门)},selected (selectedIndex.value 1),unselectedContentColor Color.Gray,selectedContentColor Color.Red,onClick {selectedIndex.value1})BottomNavigationItem(icon { Icon(imageVector Icons.Default.ShoppingCart,) },label { Text(text 购物车)},selected (selectedIndex.value 2) ,unselectedContentColor Color.Gray,selectedContentColor Color.Red,onClick { selectedIndex.value 2 })BottomNavigationItem(icon{Icon(imageVector Icons.Default.Person,)},label {Text(text我的)},selected (selectedIndex.value 3),unselectedContentColor Color.Gray,selectedContentColor Color.Red,onClick {selectedIndex.value3})}
}Composable
fun OrderNowTopBar() {TopAppBar(title {Text(text stringResource(id R.string.app_name),textAlign TextAlign.Center,modifier Modifier.fillMaxWidth())},backgroundColor MaterialTheme.colors.background,contentColor contentColorFor(MaterialTheme.colors.background))
}HiltAndroidApp
class OrderNowApplication : Application() {
}