3

EDIT: I NEED TO PASS A CONTEXT AS A PARAMETER TO THE CLASS

(DataStorerepositoryは同じクラスです。混乱しないでください)

私には 2 つのアクティビティがAあり、Bと 1 つrepositoryです。アクティビティはアクティビティをA開きB、アクティビティBはデータをrepository( DataStoreandroid ジェットパックの一部) に保存します。

LiveDataのデータの変化を観察するために、両方のアクティビティで使用していDataStoreます。

DataStorefrom アクティビティBで新しい値を更新した後LiveData、アクティビティ内の はB期待どおりに新しい更新された値を取得します。Aしかし、アクティビティに戻るLiveDataと、古いデータが取得されます(新しい更新されたデータが期待されます)。

repository両方のアクティビティでの 2 つのインスタンスを作成しているため、それが起こっていることに気付きました。

repositoryクラスのインスタンスを 1 つだけ作成し、それを両方のアクティビティで使用するにはどうすればよいですか? それを行うためのより良い方法があれば、その解決策も歓迎されます。

4

5 に答える 5

2

@DanBaruch のような従来のシングルトン パターンは機能しますが、アプリ全体でシングルトン インスタンスを作成できるKotlin素晴らしいキーワードが呼び出さobjectれます。

object DatabaseRepository{
    private lateinit var context: Context

    fun setAppContext(context: Context){
        this.context = context
    }
}

contextfromApplicationクラスを設定するには、以下を実行します。

DatabaseRepository.setAppContext(this)
于 2021-02-11T09:17:08.593 に答える
1

kotlin では、Singleton.

  1. キーワードを使用するobject- これにより、コンストラクターで任意の引数を使用できます。

  2. または、次のようにシングルトン クラスを作成することもできます。


class DbRepository () {

    companion object {
        private var instance: DbRepository? = null

        fun getInstance(context: Context): DbRepository {
            return instance ?: synchronized(this) {
                instance ?: DbRepository().also { instance = it }
            }
        }
    }

}


于 2021-02-11T09:21:37.480 に答える