7

皆さんにデザイン関連の質問があります。

そのため、Google のGuide to App Architectureに従って、Kotlin、MVVM、およびデータ バインディングを使用してアプリケーションを構築しています。Google の規定に従って、Jetpack コンポーネント (ナビゲーション、ライブデータなど) を使用しています。

問題は、開発中にあるフラグメントから別のフラグメントにデータを転送する必要があることが何度もあるということです。以前は、フラグメントのインスタンスを作成し、複雑なデータを追加してから、次のようにフラグメントに移動していました。

class Frag1: Fragment(){

    ...
    fun openFrag2(){
        val frg2 = frag2.newInstance(complexDataObj)
        childFragmentManager.addFragment(frg2,TAG)
    }
}

class Frag2: Fragment(){
    var cd: ComplexDataClass = null
    companion object{
    fun newInstance(complexData: ComplexDataClass): Fragment{
        val frag = ActivityFragment()
        frag.cd = complexData
        return frag
    }
    ....
}

目的地間でデータを渡すナビゲーションでは、このようにするか、同じドキュメントにも記載されているShared View Modelを使用する必要があります。>>

一般に、宛先間で最小限のデータのみを渡すことを強く推奨する必要があります。たとえば、オブジェクト自体を渡すのではなく、キーを渡してオブジェクトを取得する必要があります。これは、保存されたすべての状態の合計スペースが Android で制限されているためです。大量のデータを渡す必要がある場合は、フラグメント間でデータを共有するで説明されているように、ViewModel の使用を検討してください。

これは機能します。

問題は、アーキテクチャを使用する主な理由の 1 つが関心の分離であることです。きれいで保守しやすいコードを書くことができるように。この sharedviewmodel の使用は、(私の理解によると)その目的を無効にします。これは、大きな ViewModel クラスにつながるためです。

非常に一般的なシナリオで問題を説明しようとします。

データのリストを含むフラグメントがあります。リスト内の各項目はユーザーに対応しています。アイテムをタップすると、ユーザーの詳細画面に移動し、編集ボタンをタップすると、詳細を編集できる編集画面に移動する必要があります。

             View User Frag
             ____                 ____________
            |    |               |            |
 List Frag  |    |               |            |
 ______     |____|               |            |
|______| /
|______|/                        |            |
|______|\                        |            | Huge Shared ViewModel class
|______| \
            Edit User Frag       |            |
            _____
           |     |               |            |
           |     |
           |_____|               |____________|

したがって、この状況では、ユーザー データをリスト クラスからビューおよび編集フラグメントに送信する必要があるため、ViewModel はこれら 3 つのフラグメント間で共有され、共有 ViewModel には 3 つのフラグメントすべてのビジネス ロジックが含まれます。

多くの場合、ViewModel は複雑すぎて次のような共有として管理できないため、これは私には適切ではないようです。

model = activity?.run {
        ViewModelProviders.of(this)[SharedViewModel::class.java]
    } ?: throw Exception("Invalid Activity")

ビューモデルの同じインスタンスを提供します。

この共有ビューモデルの私の理解が間違っているかどうかを知る必要があります。間違っている場合は修正してください。私の理解が正しければ、そのような場合にビューモデルをより効率的に管理する方法を教えてください。

4

1 に答える 1