Chuyển đến nội dung chính

Jetpack Compose With MVVM

 


Kể từ khi tôi làm việc trong khoảng 2 năm trở lại đây, tôi đã là một fan hâm mộ lớn của giao diện người dùng khai báo nên tự nhiên tôi đã rất vui mừng khi nghe nói về Jetpack Compose trong Google I/O 2019 .. gần đây tôi đã tải xuống android studio canary để thử bản xem trước dành cho nhà phát triển của nó và đó là tất cả những gì tôi mong đợi và hơn thế nữa ❤


Mục đích của bài viết này là để chứng minh việc sử dụng Jetpack Compose với Kiến trúc MVVM, chúng tôi sẽ tạo một danh sách người dùng đơn giản (từ dữ liệu cục bộ) và cập nhật các giá trị của nó nhưng trước khi chúng tôi bắt đầu với mã, đây là một số gợi ý nhanh:

  • “@Composable” được chú thích trước một hàm để khai báo nó là hàm UI

  • Chú thích “@model” trước một lớp mô hình sẽ tự động cập nhật UI tương ứng khi giá trị của mô hình đó thay đổi

  • Luồng dữ liệu luôn từ trên xuống dưới nên trong MVVM, dữ liệu sẽ đến từ Kho lưu trữ -> viewModel -> hoạt động và từ trạng thái hoạt động Model sẽ được cập nhật giao diện người dùng

  • Bây giờ để xử lý các sự kiện từ giao diện người dùng như nhấp vào nút, chúng tôi sẽ sử dụng lambdas để cập nhật hoạt động của sự kiện xảy ra, từ hoạt động, luồng sẽ là hoạt động -> viewModel -> kho lưu trữ và từ kho lưu trữ, dữ liệu sẽ được gửi trở lại theo luồng đã đề cập ở điểm trên

  • Ứng dụng này chỉ dành cho mục đích trình diễn vì vậy tôi đã cố gắng giữ mã ở mức tối thiểu và để làm như vậy, tôi đã không sử dụng mẫu kho lưu trữ và dữ liệu tĩnh được tạo trong chính viewModel


Nếu bạn muốn viết code cùng với bài viết bạn sẽ cần thiết lập dự án với android studio canary(4.0) bạn có thể tải về tại đây

Khi nó được thiết lập, hãy tạo một dự án mới và chọn hoạt động Compose trống làm mẫu dự án


Bây giờ chúng ta hãy bắt đầu với mã hóa

Trước hết chúng ta sẽ cần một mô hình người dùng đơn giản vì chúng ta đang tạo một danh sách người dùng, tạo một lớp mới có tên UserModel


class UserModel(name:String,surName:String,job:String) {
var userName:String = name
var userSurName:String = surName
var userJob:String = job
}

Bây giờ hãy tạo một lớp Model để giữ danh sách UserModels. Chúng tôi sẽ cần thông báo cho UI khi danh sách được cập nhật, vì vậy chúng tôi sẽ chú thích mô hình này bằng “@model”


import androidx.compose.Model

@Model
class UsersState(var users:ArrayList<UserModel> = ArrayList())

Bây giờ tạo một lớp đối tượng để giữ các hàm có thể kết hợp cho giao diện người dùng, hàm của chúng ta sẽ lấy UserState làm tham số, một điều cần lưu ý ở đây là chúng ta có thể sử dụng mã Kotlin thông thường trong các hàm có thể kết hợp để đạt được nhiệm vụ của mình

import androidx.compose.Composable
import androidx.ui.core.Text
import androidx.ui.core.dp
import androidx.ui.foundation.VerticalScroller
import androidx.ui.graphics.Color
import androidx.ui.layout.Column
import androidx.ui.layout.FlexColumn
import androidx.ui.layout.Row
import androidx.ui.layout.WidthSpacer
import androidx.ui.material.*

object UsersListUi {

@Composable
fun addList(state: UsersState) {
MaterialTheme {
FlexColumn {
inflexible {
// Item height will be equal content height
TopAppBar( // App Bar with title
title = { Text("Users") }
)
VerticalScroller {
Column {
state.users.forEach {
Column {
Row {
Text(text = it.userName)
WidthSpacer(width = 2.dp)
Text(text = it.userSurName)
}
Text(text = it.userJob)

}
Divider(color = Color.Black, height = 1.dp)

}
}
}
}

}
}

}


}

Ở đây trong mã trên, chúng tôi đang sử dụng cho vòng lặp để hiển thị danh sách không hiệu quả lắm, để mã hóa nó hiệu quả hơn google trêu chọc một cái gì đó được gọi là ScrollingList ... hiện tại khi viết bài viết này, nó chưa phải là một phần của Jetpack Compose nhưng nếu bạn đang đọc nó đôi khi trong tương lai hãy cố gắng thay thế dòng này bằng vòng lặp, nếu ScrollingList được phát hành, nó sẽ hoạt động nếu không bạn sẽ phải chờ đợi.


//state.users.forEach {
ScrollingList(state.users) {it ->

Bây giờ, hãy tạo một viewModel chứa logic nghiệp vụ, chúng tôi sẽ sử dụng livedata cho danh sách userModel


Thêm các phần phụ thuộc này vào tệp build.gradle của bạn


implementation 'android.arch.lifecycle:runtime:1.1.1'
implementation 'android.arch.lifecycle:extensions:1.1.1'


Tạo một tệp mới cho UsersListViewModel


import androidx.lifecycle.MutableLiveData

class UsersListViewModel {

private val usersList: MutableLiveData<ArrayList<UserModel>> by lazy {
MutableLiveData<ArrayList<UserModel>>()
}
private val users:ArrayList<UserModel> = ArrayList()
fun addUsers(){
users.add(UserModel("jon","doe","android developer"))
users.add(UserModel("john","doe","flutter developer"))
users.add(UserModel("jonn","dove","ios developer"))
usersList.value = users
}

fun getUsers():MutableLiveData<ArrayList<UserModel>>{
return usersList
}
}

Bây giờ hãy kết hợp mọi thứ lại với nhau trong MainActivity


import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Observer
import androidx.ui.core.setContent

class MainActivity : AppCompatActivity() {
private val usersState: UsersState = UsersState()
private val usersListViewModel:UsersListViewModel = UsersListViewModel()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

usersListViewModel.getUsers().observe(this, Observer {
usersState.users.addAll(it)
})
usersListViewModel.addUsers()
setContent {
UsersListUi.addList(usersState)
}
}

}


  • Chạy ứng dụng

Tất cả các mã cho đến bây giờ đều có sẵn ở đây


Những người muốn hiểu sâu hơn và thêm và xóa dữ liệu khỏi danh sách, đây là những gì bạn có thể làm 


trong lớp UsersListUi


thay đổi hàm tạo của phương thức addList để chấp nhận 2 lamdas để thông báo hoạt động khi nhấp vào nút


@Composable
fun addList(state: UsersState, onAddClick: () -> Unit, onRemoveClick: () -> Unit) {

sau đó thêm 2 nút và gọi lamdas khi nhấp chuột


FlexRow() {
expanded(flex = 1f) {
Button(
text = "add",
onClick = { onAddClick.invoke() },
style = OutlinedButtonStyle()
)

}
expanded(flex = 1f) {
Button(
text = "sub",
onClick = { onRemoveClick.invoke() },
style = OutlinedButtonStyle()
)
}
}

Từ MainActivity gửi lamdas đến hàm

UsersListUi.addList(
usersState,
onAddClick = { usersListViewModel.addNewUser() },
onRemoveClick = { usersListViewModel.removeFirstUser() })

Tại đây khi một nút được nhấp vào, nó sẽ gọi lamda sẽ thông báo hoạt động và hoạt động sẽ gọi các phương thức từ viewModel để cập nhật dữ liệu trong danh sách.

Cảm ơn bạn đã đọc!




Nhận xét

Bài đăng phổ biến từ blog này

Thiết kế giao diện với DotNetBar (Phần 1)

Đây là phiên bản DotNetBar hỗ trợ C# và Visual Basic https://www.dropbox.com/s/wx80jpvgnlrmtux/DotNetBar.rar  , phiên bản này hỗ trợ giao diện Metro cực kỳ “dễ thương” Các bạn load về và cài đặt, khi cài đặt xong sẽ có source code mẫu của tất cả các control. Để sử dụng được các control của DotNetBar các bạn nhớ add item vào controls box. Thiết kế giao diện với DotNetBar, giao diện sẽ rất đẹp. Link các video hướng dẫn chi tiết cách sử dụng và coding: http://www.devcomponents.com/dotnetbar/movies.aspx Hiện tại DotNetBar có rất nhiều công cụ cực mạnh, trong đó có 3 công cụ dưới đây: DotNetBar for Windows Forms Requires with Visual Studio 2003, 2005, 2008, 2010 or 2012.   DotNetBar for WPF Requires with Visual Studio 2010 or 2012 and Windows Presentation Foundation.   DotNetBar for Silverlight Requires with Visual Studio 2010 or 2012 and Silverlight. Dưới đây là một số hình ảnh về các control trong DotnetBar.   Metro User Interface  controls with Metro Tiles, toolba...

Announcing Flutter 2

  Phụ lục: Flutter on the web Flutter 2 on desktops, foldables, and embedded devices The growing Flutter ecosystem Dart: The secret sauce behind Flutter Flutter 2: Available now Hôm nay, chúng tôi sẽ công bố Flutter 2: một bản nâng cấp lớn cho Flutter cho phép các nhà phát triển tạo các ứng dụng đẹp, nhanh chóng và di động cho bất kỳ nền tảng nào. Với Flutter 2, bạn có thể sử dụng cùng một cơ sở mã để gửi các ứng dụng gốc cho năm hệ điều hành: IOS, Android, Windows, macOS và Linux; cũng như trải nghiệm web nhắm mục tiêu các trình duyệt như Chrome, Firefox, Safari hoặc Edge. Flutter thậm chí có thể được nhúng vào ô tô, TV và thiết bị gia dụng thông minh, mang đến trải nghiệm di động và lan tỏa nhất cho thế giới điện toán xung quanh. Mục tiêu của chúng tôi là thay đổi cơ bản cách các nhà phát triển nghĩ về việc xây dựng ứng dụng, bắt đầu không phải với nền tảng bạn đang nhắm mục tiêu mà là với trải nghiệm bạn muốn tạo. Flutter cho phép bạn tạo ra những trải nghiệm tuyệt đẹp trong đó ...

Jetpack Compose VS SwiftUI !VS Flutter

  Việc phát triển Android đã trở nên dễ dàng hơn khi các bản cập nhật liên tục đến. Sau bản cập nhật 2020.3.1, rất nhiều thứ đã thay đổi. Nhưng thay đổi chính mà tôi nghĩ hầu hết các nhà phát triển phải chờ đợi là Jetpack Compose cho ứng dụng sản xuất. Và Kotlin là lựa chọn duy nhất cho jetpack Compose, cũng là ngôn ngữ được ưu tiên. Để biết thêm chi tiết hoặc các thay đổi trên Jetpack Compose, bạn có thể truy cập vào https://developer.android.com/jetpack/compose Tương tự, IOS Development cũng cung cấp một tùy chọn để phát triển khai báo, SwiftUI. Trong IDE, không có thay đổi nào do điều này. Nhưng khái niệm gần giống với Jetpack Compose. Thay vì bảng phân cảnh, chúng tôi tạo giao diện người dùng bằng Swift. Để biết thêm chi tiết hoặc các thay đổi trên SwiftUI, hãy truy cập https://developer.apple.com/xcode/swiftui/ Hãy xem cách cả hai hoạt động bằng cách sử dụng một dự án demo. Tôi đã lấy một số ví dụ về số lần chạm tương tự của Flutter. 1. Android Jetpack Compose Chúng tôi có thể...