제트 팩 Compse 전투 - 새로운 개발 경험

아니 대중에게 답장을 Compose설치 패키지를 얻기 위해

프로젝트 주소 : Wanandroid-작성

얼마 전에 안드로이드 데브 정상 회의 후, 나는 당신이 아이디어가 생각 제트 팩 작성을 . 당신이 들었하지 않은 경우,이 문서 읽을 수있는 제트 팩의 최신 개발 편지 쓰기를 . 모두 모두, 작성은이다 전복선언적 UI 프레임 워크 , 그 모토는 것입니다 xml 파일을 파괴!

제트 팩 작성 만 프리뷰 버전이지만, API는, 적절한 제어 지원의 부족을 변경, 또는하지 안정 그래서,하지만 그건 나에게 Fengyun 호기심이 마음을 중지 할 수 있습니다. 나는 기능은 광고 및 네이티브 안드로이드 페이지와 유사 최신 프로젝트 만 가정을 포함하여, 비교적 간단 라인과 작성 버전 Wanandroid 응용 프로그램의 첫 번째 시간을 시작했다 Viewpager + TabLayout. 쇼 아래 GIF와 응용 프로그램의 기본 페이지 :

페이지는 심지어 내가 풀다운 새로 고침을 수행하는 방법을 찾을 수 없습니다, 그래서 부드럽게,보기 재사용 문제가 될해서는 안 볼 수 있습니다. 그래서, 작성은 우리에게 전혀 아무것도 가져? 대답이 질문에 전에, 안드로이드 애플리케이션 아키텍처 문제에 대한 말씀을 전합니다.

불모 년 - MVC

내가 라인에 합류하면, 안드로이드 개발의 황금 시대, 그것은라고 할 수 있다고 할 수있다 불모의 개발자의 시대가. 한편으로는 할 기본적인 쓰기 XML은 일자리를 얻을 수 있다고해도 과언이 아니다. 한편, 개발자를위한, 멀지 않은 현재의 개발 아키텍처 사양에서. 나는 그 해의 주요 개발 프레임 워크이고, 정확하게 기억 xUtils 2레이아웃과 ID, 사진 갤러리 네트워크 요청, ORM 작업, 모든 바인딩, 도서관 라운드 계약. 레이아웃 다음 ID 바인딩 또는 오히려 컴파일 노트 이상의 런타임 반사. 오랜 시간 동안, 안드로이드, 심지어 공식적인 네트워크 라이브러리는 없습니다.

아키텍처에서, 많은 사람들이 활동 라인과 다이에, 나는 수천 라인 MainActivity의 zouguolai 만난 적이 있습니다. 그리고 나는 이것이 MVC 아키텍처, 그 엔티티 Entity 클래스라고 생각 ModelActivity/Fragment이며, Controller층, 레이아웃 파일이 View계층.

그러나이 정말 MVC그것? 정말. 그것은 여부 MVC, MVP또는 MVVM최소한의 원칙을 따라야합니다, 프리젠 테이션 계층과 서비스 계층 분리 안드로이드의 공식 웹 사이트에 나와, 응용 프로그램 아키텍처 가이드는 강조 의 분리를 . Activity/Fragment데이터를 얻기 위해, 뷰 층, 디스플레이의 작업을 가정하고 UI를 업데이트 할뿐만 아니라 비즈니스 로직 계층과 거래를하는 것이 필요하다. 이 건축 설계의 기본 원칙과 일치하지 않습니다.

올바른 MVC 모델은 모델 층은 엔티티 클래스 엔티티는, 더 중요한 역할은 비즈니스 로직이 포함되어 있습니다. 보기 계층은 논리적보기를 처리합니다. 컨트롤러는 모델과 뷰 사이의 다리입니다. 어떻게 다리가 지어진, 사실은 자신의 필요 그것은에 따라, 표준이 없다.

루안 이풍은 그러나 반드시 완전히 한 방향 의존성, 그리기, 일반적으로 같은 의미의 교사를 인용했다.

올 불모의 시대에서, MVC 마지막으로, 거기에보기 및 비즈니스 계층 (layer)의 분리를 조금 레이어 맛. 그러나 종속 모델보기 층과 층은 커플 링을 유발하는 코드는 결국 점점 활동 부풀어로 이어질 것입니다. 그래서 뷰 레이어와 모델 층이 완전히 분리되어 완전한 분리 층과 모델 층을 볼 수있는 방법이 있습니까? MVP가 들어왔다.

청동 년 - MVP

루안 이풍 교사 스틸 사진 :

MVC에 비해 MVP 사용 Presenter 层대신 Controller 层하고 View 层그리고 Model 层완전히 발표자 통신 의존 분리.

사용자 정보를 얻기 위해 장면을 상상해보십시오. IView인터페이스 층의 인터페이스에서 정의 된 뷰 일련보기 층 (활동)을 구현 IView대응보기 인터페이스 로직. 비즈니스 로직, 즉, 사용자 정보 요청에 의해 개최 발표자 층. 일반적으로, 직접적으로 비즈니스 로직 발표자, 모델 층하지만, 예를 들어, 저장소 데이터웨어 하우스, 수집 된 데이터는, 발표자, 지방을 가지고 같은 실수를 방지 할 수 있습니다. 한편, 발표자 층은 볼을 보유하고, 사용자 정보를 획득 한 후 전달보기.

보기 및 모델의 MVP가 완전히 분리, 발표자 통신을 요약합니다. 보기 발표자 및 공동 처리 뷰 레이어 로직은 모델 계층은 비즈니스 로직을 담당합니다.

Github에서 안드로이드 공식 아키텍처의 예에서 아키텍처 샘플 오랫동안 회사의 본점과 MVP있다. 내 첫 번째 예는 오랜 시간 동안 공식 자신의 MVP 아키텍처의 변환 및 사용을 기반으로합니다. 그러나 사업의 복잡성 증가와 인터페이스 지향 프로그래밍과 MVP 아키텍처는, 모든 곳에서 데자부 인터페이스의 종류, 그것은 조금 성가신을 보였다.

또 다른 점은, 관세 경계 발표자 분명 충분하지 않습니다, 그것은 비즈니스 로직을 얻기 위해 곰뿐만 아니라 모델의 레이어를 호출뿐만 아니라보기 층 처리 UI를 제어 할 수 있습니다. 다음 코드 조각으로 뭔가를 말 :

class LoginPresenter(private val mView: LoginContract.View) : LoginContract.Presenter {

    ......

    override fun login(userName: String, passWord: String) {
        CoroutineScope(Dispatchers.Main).launch {
            val result = WanRetrofitClient.service.login(userName, passWord).await()
            with(result) {
                if (errorCode == -1)  mView.loginError(errorMsg) else mView.login(data)
            }
        }
    }
}

보기 층의 변화가 발생하면, 발표자 층은 적절하게 변경해야합니다. 보기 및 모델,보기 및 발표자하지만 부부 사이에 분리하는 동안. 이상적으로, 발표자 층은 데이터에 대한 책임에만 액세스 할 수보기 레이어 자동 관측 데이터를 변경해야합니다. 그래서, MVVM 여기.

황금 시대 - MVVM

마을의 집 구글의 공식보기.

사라진 이후 MVP 풍경은 오래, 안드로이드 공식 아키텍처 예를 들어 한 아키텍처 샘플 의 주요 지점은 MVVM로 전환했다. 안드로이드 MVVM 아키텍처에서, 뷰 모델이 가장 중요하며, 이는 수집 된 데이터에서 다른 한편으로 업데이트 활동에 대한 데이터웨어 하우스를 통해 획득 한 측면 저장소 / 조각보기 층입니다. 등등, 발표자는 이러한 일을하지 않았다 방법이 문장이 너무 익숙한 들어? 사실, 그들은 비슷 일을하고 있지만 실현은 완전히 다릅니다.

내 오픈 소스 프로젝트에서 Wanandroid는 이다 LoginViewModel예 :

class LoginViewModel(val repository: LoginRepository) : BaseViewModel() {

    private val _uiState = MutableLiveData<LoginUiModel>()
    val uiState: LiveData<LoginUiModel>
        get() = _uiState


    fun loginDataChanged(userName: String, passWord: String) {
        emitUiState(enableLoginButton = isInputValid(userName, passWord))
    }

    // ViewModel 只处理视图逻辑,数据仓库 Repository 负责业务逻辑
    fun login(userName: String, passWord: String) {
        viewModelScope.launch(Dispatchers.Default) {
            if (userName.isBlank() || passWord.isBlank()) return@launch

            withContext(Dispatchers.Main) { showLoading() }

            val result = repository.login(userName, passWord)

            withContext(Dispatchers.Main) {
                if (result is Result.Success) {
                    emitUiState(showSuccess = result.data,enableLoginButton = true)
                } else if (result is Result.Error) {
                    emitUiState(showError = result.exception.message,enableLoginButton = true)
                }
            }
        }
    }

    private fun showLoading() {
        emitUiState(true)
    }

    private fun emitUiState(
            showProgress: Boolean = false,
            showError: String? = null,
            showSuccess: User? = null,
            enableLoginButton: Boolean = false,
            needLogin: Boolean = false
    ) {
        val uiModel = LoginUiModel(showProgress, showError, showSuccess, enableLoginButton,needLogin)
        _uiState.value = uiModel
    }

    data class LoginUiModel(
            val showProgress: Boolean,
            val showError: String?,
            val showSuccess: User?,
            val enableLoginButton: Boolean,
            val needLogin:Boolean
    )
}

볼 수있는, 뷰 모델보기,보기 LIveData 관찰, 기반 관찰자 패턴에 의해 변화 데이터를 관찰하고 뷰 모델이 완전히 분리 않는 인용되지 않습니다.

뷰를 데이터 기반 이는 제트 팩 MVVM은 존중 중요한 원칙은. 기본 데이터 스트림은 다음과 같습니다 :

  • 저장소 데이터 층 획득 및 다른 데이터 소스로부터 데이터를 통합에 대한 책임, 실질적으로 모든 비즈니스 로직에 대한 책임
  • 뷰 모델은 저장소, 데이터 및 드라이버 업데이트를 얻을 수있는보기 층을 보유하고
  • 보기는 관측 LiveData가 수행, 데이터 기반 UI를 뷰 모델을 보유하고

그리고 일부 개발자는 상당히 ** 데이터 바인딩을 사용하지 않는, 그런 문제에 대해 MVVM을 이야기했다? ** 나는 MVVM의 핵심은 결코 데이터 바인딩을 거짓말을하지 않습니다 생각합니다. 데이터 바인딩은 우리에게 도움이 될 수 있습니다 데이터 기반 뷰를 , 궁극을 달성하기 위해 당신이 양방향 바인딩 할 수있는 방법을.

제트 팩 MVVM은 대부분의 작품에 만족을 위해 말을하고, 그 이외의 데이터 바인딩 이외의 아무것도 없다. 내가 확실하게 어떤 프로젝트에의 도입에 반대하고 좁은 데이터 바인딩은 XML의 내부에서 인류 로직 코드에 대해 작성된 라이브러리에 생각합니다. 그것의 KunminX 읽기의 오류에 쉽게 때 자기 의견을 고집하는 진짜 홍콩 제트 팩 데이터 바인딩에 반대되는 : 재 학습 안드로이드를! 그 후, 문서 이름으로, 정말 향기.

향기로운 향 참, 나 일찍 일하는 모든 메이크업은 좋은 것입니다. 나는 로그를 저지 몇 번, 나는 썼다 어댑터 파괴 난 그냥 데이터 바인딩이 RecyclerView의 어댑터 대부분을 제거 사용 된 단어입니다. 하지만 내 불안한 양심을 제출 한 후,이 정말 인류가합니까, XML 파일의 추구 또는 쓰기 로직 코드?

미래가 될 수 있습니다 - 제트 팩 작성

지금 당신은 내가 집행의 제트 팩 작성에 읽은 것을 이해 할 수 있어야한다. 다른 기능으로는 내 의견으로는, 그것은에 완벽한 솔루션입니다, 주위 단행 의 데이터 중심보기 문제, 나는 데이터 바인딩을 사용할 필요가 없습니다.

작성 표시하는 방법을 간단한 코드 사용. 다음 코드는 홈 탭에서 문서의 목록을 보여줍니다.

@Composable
fun MainTab(articleUiModel: ArticleViewModel.ArticleUiModel?) {

    VerticalScroller {
        FlexColumn {
            inflexible {
                HeightSpacer(height = 16.dp)
            }
            flexible(1f) {
                articleUiModel?.showSuccess?.datas?.forEach {
                    ArticleItem(article = it)
                }

                articleUiModel?.showError?.let { toast(App.CONTEXT, it) }
wenjian
                articleUiModel?.showLoading?.let { Progress() }
            }
        }
    }
}

문구가 호출됩니다 선언적 프로그래밍을 나는 매우 잘 알고 있어야 떨림 학생들를 사용합니다. 방법 매개 변수는 ArticleUiModel상기 데이터 엔티티 클래스, 직접 UI 데이터 ArticleUiModel 따라 구성된. 그는 특유의 요점은 당신이 사각형을 그릴 수 있도록, 당신에게 사각형의 길이와 폭을 제공하는 것입니다 말했다. 마지막으로, 추가 @Compose주석을 사용할 수있는 UI의 구성 요소입니다. 또한이 개 UI 구성 요소를 사용하여 코드를 자세히 살펴보면, ArticleItem하고 Progress, 코드가 게시되지 않습니다. 기사 및로드 진행률 표시 줄의 즉 항목 항목의 목록입니다.

그럼, 어떻게 데이터 업데이트합니까? 가장 쉬운 방법은 사용하는 것입니다 @Model주석.

@Model
data class ArticleUiModel(){
  ......
}

네, 간단한. @Model참고 자동으로 데이터 클래스가 긴 ArticleUIModel 변화에 따라, UI가 자동으로 업데이트됩니다, 관찰 대상이 될 둘 것이다.

하지만 성능이 너무 정상이 보인다, 실제 개발에 함께 LiveData에 사용됩니다. 나중에 중간에 실수로 LiveData에 대한 해결책이 특별한 거래를 할 보았다 :

// general purpose observe effect. this will likely be provided by LiveData. effect API for
// compose will also simplify soon.
fun <T> observe(data: LiveData<T>) = effectOf<T?> {
    val result = +state<T?> { data.value }
    val observer = +memo { Observer<T> { result.value = it } }

    +onCommit(data) {
        data.observeForever(observer)
        onDispose { data.removeObserver(observer) }
    }

    result.value
}wenjian

LiveData은 조각 / 활동에서 관찰 할 수있다 :

class MainActivity : BaseVMActivity<ArticleViewModel>() {

    override fun initView() {
        setContent {
           +observe(mViewModel.uiState)
            WanandroidApp(mViewModel)
        }
    }

    override fun initData() {
       mViewModel.getHomeArticleList()
    }
}

관측은 자동적으로 LiveData보기 층에 포함될 수 있습니다.

어떤 XML은 어떤 데이터 바인딩은 모든 것이 훨씬 더 바람직 보지 않는다. 그러나 너무 작은 Zaoxin UI 경험이있다, 당신은 공공의 숫자에 회신 할 수 있습니다 작성 설치 경험을 제공합니다. 이해할 아직 초기 프리뷰 버전, 때문에. 나는 릴리스 릴리스 버전까지 완전히보기 시스템의 사운드 트랙을 대체하기에 충분해야한다 생각합니다.

이 기사는 없습니다 세부 과정 및 기타 기능이 제트 팩 작성을 설명하지 나는 다음과 같은 두 개의 기사를 추천하십시오. :

최종적으로

안드로이드 제트 팩 공식 웹 사이트 소개 페이지가 말했듯이, 제트 팩은 개발자가보다 쉽게 ​​고품질의 응용 프로그램을 작성할 수 있습니다. 실제로, 애플리케이션 아키텍처의 사양, 우리는 단지 충돌 및 메모리 누수, 강력한 빌드 품질의 애플리케이션을 줄이고, 개발을 가속화 상용구 코드 제거하는 데 필요한 코드에 초점을 맞출 필요가있다. 나는 응용 프로그램을 구축하기 위해 제트 팩을 사용하지 않는 어떤 이유로 생각할 수 없다. [작성은 제트 팩의 퍼즐의 매우 중요한 부분이라고 할 것입니다 동안.

제트 팩 Compse, 미래가 될 수 있습니다!


기술 교류 그룹을 추가, 내 마이크로 편지를 추가합니다.

있는 공개 무대 응답 "작성"은, 최신 설치 패키지를 얻을.

추천

출처www.cnblogs.com/bingxinshuo/p/11879246.html