简体   繁体   中英

Dagger hilt injects before data binding

I'm trying to use Dagger hilt in my project. I have an Activity that uses Databinding:

@AndroidEntryPoint
class MainActivity : AppCompatActivity(), SetGreeting {


    private lateinit var binding: ActivityMainBinding

    @Inject
    lateinit var fragmentFactory: FragmentsFactory

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        supportFragmentManager.fragmentFactory = fragmentFactory
        ...

    }

    override fun greeting(msg: String) {
       binding.greeting.text = msg
    }

}

this is how I use greeting interface:

interface SetGreeting {
    fun greeting(msg: String)
}


@Module
@InstallIn(ActivityComponent::class)
object SetGreetingModule {
    @Provides
    fun provideGreeting(): SetGreeting {
        return MainActivity()
    }
}

which would be used inside of a fragment just like this:


@AndroidEntryPoint
class MainFragment : Fragment() {


    private val viewModel: MainViewModel by viewModels()
    private lateinit var binding: FragmentMainBinding

    @Inject
    lateinit var greetings: SetGreeting

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.greeting.observe(viewLifecycleOwner, {
            it?.let { msg ->
                greetings.greeting(msg)
            }
        })

    }
}

The problem is that when I added Dagger to the project, data binding won't work, and it returns null. So when the override function greeting would be called, I get a null pointer exception.

I think dagger does not call onCreate so binding = DataBindingUtil.setContentView(this, R.layout.activity_main) is not called then binding will be null. try to initialize the binding object in init block init{binding = DataBindingUtil.setContentView(this, R.layout.activity_main) }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM