Kotlin Companion Object является нулевым при ссылке - PullRequest
0 голосов
/ 04 октября 2018

Не уверен, правильно ли я использую этот объект-компаньон.

Класс данных:

data class AppModel(
    val name: String,
    val items: List<ItemModel>,
)

Установите данные:

open class PathManager() {

    companion object {
        var shared = PathManager()    // SHARED OBJECT IN QUESTION
    }

    var app: AppModel? = null

    fun setUp() {
        // Show loading...

        // Parse the JSON
        val gson = GsonBuilder().create()
        val text = mainActivity.resources.openRawResource(R.raw.jsonFile)  
            .bufferedReader().use { it.readText() }
        val appModel = gson.fromJson(text, AppModel::class.java)

        app = appModel

        performInitialPath()
    } 

    private fun performInitialPath() {

        val app = app?.let { it } ?: error("Attempted to start without an App Config.")

        this.app = app    // DEBUGGER SHOWS CORRECT VALUES HERE

        // Removed irrelevant code for readability, builds 'initialFoo' here

        this.mainActivity.addFragment(initialFoo)
    }
}

Класс построителя фрагментов (выглядитдля сопутствующего объекта Path Manager здесь):

class Frag : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        var itemModels: List<ItemModel>? = null

        if(PathManager.shared.app?.items != null) {  // NULL - WHY?
            itemModels = PathManager.shared.app?.items  
        }
   }
}

Подводя итог, что происходит:

  1. AppModel правильно построен в PathManager ().Данные есть (можно увидеть в отладчике)

  2. Path Manager запускает класс 'Frag ()'

  3. Ссылки на класс Frag () возвращаются ксопутствующий объект, созданный в PathManager (), пытается найти данные в PathManager.shared.app?.items, но данные там нулевые, тогда как это не должно быть.Разве объект-компаньон не совпадает со статической переменной?

Я уверен, что что-то упустил, просто ищу совет.Я правильно называю объект-компаньон?Могу ли я не ссылаться на это из нового класса, как это?Что дает?

1 Ответ

0 голосов
/ 04 октября 2018

PathManager.shared.app?.items всегда равно нулю, потому что вы никогда не назначаете AppModel для объекта-компаньона.var app: AppModel? = null экземпляр в PathManager классе и PathManager.shared.app - это два разных объекта.

Для хранения статических данных вы можете сделать что-то, как показано ниже:

open class PathManager() {

    companion object {
        //Here Don't create object is you dont need it 
        //var shared = PathManager()    // SHARED OBJECT IN QUESTION

        //Create AppModel instance.
        var mAppModel: AppModel? = null
    }

    //Comment this as will manage companion object.
    //var app: AppModel? = null

    fun setUp() {
        // Show loading...

        // Parse the JSON
        val gson = GsonBuilder().create()
        val text = mainActivity.resources.openRawResource(R.raw.jsonFile)  
            .bufferedReader().use { it.readText() }
        val appModel = gson.fromJson(text, AppModel::class.java)

        mAppModel = appModel

        performInitialPath()
    } 

    private fun performInitialPath() {

        val app = app?.let { it } ?: error("Attempted to start without an App Config.")

        mAppModel = app    // DEBUGGER SHOWS CORRECT VALUES HERE

        // Removed irrelevant code for readability, builds 'initialFoo' here

        this.mainActivity.addFragment(initialFoo)
    }
}

И использовать этов другом классе

class Frag : Fragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {

        var itemModels: List<ItemModel>? = null
        //Retrive the list from shared object.
        if(PathManager.mAppModel?.items != null) {  // NULL - WHY?
            itemModels = PathManager.mAppModel?.items  
        }
   }
}
...