引用时Kotlin随播对象为null

时间:2018-10-04 06:09:18

标签: android kotlin null fragment companion-object

不确定我是否正确使用了这个随播对象。

数据类:

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)
    }
}

Fragment Builder类(在此处查找路径管理器伴随对象):

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. 路径管理器启动'Frag()'类

  3. Frag()类引用回到在其中创建的伴随对象 PathManager(),尝试在其中查找数据 “ PathManager.shared.app?.items”,但其中的数据为空 应该没有。随播对象与静态对象不同吗? 变量?

我确定我正在丢失某些东西,只是在寻求建议。我是否正确调用了同伴对象?我不能从这样的新类中引用它吗?有什么作用?

1 个答案:

答案 0 :(得分:2)

PathManager.shared.app?.items始终为null,因为您从未将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  
        }
   }
}