(Kotlin) NullPointerException в текстовом представлении с использованием обратного вызова с экземпляром объекта Dagger 2 - PullRequest
0 голосов
/ 02 июля 2018

NullPointerException в textview, когда я пытаюсь изменить текст с помощью объекта экземпляра кинжала 2. Примечание. Использование общего экземпляра (нового Myobjcet (this)) работает.

активность

class MainActivity : AppCompatActivity(), MyCallBack{

        @Inject
        lateinit var myObject: MyObject

        override fun onCreate(savedInstanceState: Bundle?) { 
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            mytextview.text = "first change"

            val myComponent = (application as App).myComponent
            myComponent.inject(this)

        }

        override fun callBack(string: String) {
            try {
                mytextview.text = string
            } catch (e: Exception) {
                Log.d("xxx", e.toString())
            }
        }
    }

Object

    class MyObject(var res: MyCallBack) {
    init {
        res.callBack("second change")
    }
}

Компонент

@Component(modules = MyModule.class)
public interface MyComponent {

    void inject(MainActivity mainActivity);
}

Модуль

@Module
class MyModule {

@Provides
fun proviesMyObject(): MyObject = MyObject(MainActivity())
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

проблема связана с тем, что вы вручную создаете экземпляр MainActivity при создании MyObject в своем модуле. поскольку он создается вручную, он не управляется платформой и, следовательно, не проходит ожидаемый жизненный цикл (например, onCreate(), onStart(), onResume() и т. д.).

(примечание: никогда не делайте этого в рабочем коде).

, поскольку onCreate() никогда не запускается для этого экземпляра, созданного вручную, компоновка для этого экземпляра не завышена, поэтому MyObject ссылается на Activity (как реализацию MyCallBack), который не знает о любой View с.

если вы хотите включить действительный управляемый фреймворком экземпляр MyActivity в свой граф объектов, одним из решений будет добавление его в качестве обязательного параметра конструктора в ваш модуль, например:

@Module
class MyModule(private val myCallBack: MyCallBack) {
    @Provides 
    fun providesMyObject(): MyObject = MyObject(myCallBack)
}

... затем в MainActivity создайте компонент и выполните самоинжекцию следующим образом:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main2)

    mytextview.text = "first change"

    DaggerMyComponent.builder()
            .myModule(MyModule(this))
            .build()
            .inject(this)
}

надеюсь, что это поможет прояснить ситуацию!

0 голосов
/ 03 июля 2018

Проблема заключается в том, что в вашем Модуле вы создаете новую MainActivity, отличную от той, которая создается платформой. Вы должны понимать, что если вы вручную создали экземпляр действия, его представления не будут раздуты, следовательно, исключение NullPointerException. Я предлагаю вам передать экземпляр вашей активности в вашем модуле.

@Module
class MyModule(val res: MyCallBack) {

    @Provides
    fun providesMyObject(): MyObject = MyObject(res)
}

Создание экземпляра вашего компонента в MainActivity, например

val myComponent = DaggerMyComponent.builder()
    .myModule(MyModule(this))
    .build()
myComponent.inject(this)
...