Hilt 正在将 public 字段转换为私有字段并且注入失败

Hilt is converting a public field to private and failing to inject

我正在尝试学习 Hilt,但收到错误消息“Dagger 不支持注入私有字段”。但在原始 Kotlin 中,所讨论的字段并不是私有的。它只有在转换为 Java 时才是私有的。为什么是这样?我该如何更正它?

原始 Kotlin 文件:

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import com.example.vennwithnav.databinding.FragmentLoginBinding
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject

@AndroidEntryPoint
class LoginFragment : Fragment() {
    @Inject public var profileViewModel: ProfileViewModel? = null
    private var binding: FragmentLoginBinding? = null

Java 转换后的文件(通过错误访问):

package com.example.vennwithnav.ui.profile;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.example.vennwithnav.databinding.FragmentLoginBinding;
import dagger.hilt.android.AndroidEntryPoint;
import javax.inject.Inject;

@kotlin.Metadata(mv = {1, 4, 1}, bv = {1, 0, 3}, k = 1, d1 = {"\u0000:\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0005\n\u0002\u0010\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\b\u0002\b\u0007\u0018\u00002\u00020\u0001B\u0005\u00a2\u0006\u0002\u0010\u0002J\u0006\u0010\u000b\u001a\u00020\fJ&\u0010\r\u001a\u0004\u0018\u00010\u000e2\u0006\u0010\u000f\u001a\u00020\u00102\b\u0010\u0011\u001a\u0004\u0018\u00010\u00122\b\u0010\u0013\u001a\u0004\u0018\u00010\u0014H\u0016J\b\u0010\u0015\u001a\u00020\fH\u0016R\u0010\u0010\u0003\u001a\u0004\u0018\u00010\u0004X\u0082\u000e\u00a2\u0006\u0002\n\u0000R\u001a\u0010\u0005\u001a\u00020\u0006X\u0086\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\b\u0007\u0010\b\"\u0004\b\t\u0010\n\u00a8\u0006\u0016"}, d2 = {"Lcom/example/vennwithnav/ui/profile/LoginFragment;", "Landroidx/fragment/app/Fragment;", "()V", "binding", "Lcom/example/vennwithnav/databinding/FragmentLoginBinding;", "profileViewModel", "Lcom/example/vennwithnav/ui/profile/ProfileViewModel;", "getProfileViewModel", "()Lcom/example/vennwithnav/ui/profile/ProfileViewModel;", "setProfileViewModel", "(Lcom/example/vennwithnav/ui/profile/ProfileViewModel;)V", "login", "", "onCreateView", "Landroid/view/View;", "inflater", "Landroid/view/LayoutInflater;", "container", "Landroid/view/ViewGroup;", "savedInstanceState", "Landroid/os/Bundle;", "onDestroyView", "app_debug"})
@dagger.hilt.android.AndroidEntryPoint()
public final class LoginFragment extends androidx.fragment.app.Fragment {
    @org.jetbrains.annotations.NotNull()
    private com.example.vennwithnav.ui.profile.ProfileViewModel profileViewModel; // this line is causing the error
    private com.example.vennwithnav.databinding.FragmentLoginBinding binding;
    
    @org.jetbrains.annotations.NotNull()
    public final com.example.vennwithnav.ui.profile.ProfileViewModel getProfileViewModel() {
        return null;
    }
    
    public final void setProfileViewModel(@org.jetbrains.annotations.NotNull()
    com.example.vennwithnav.ui.profile.ProfileViewModel p0) {
    }

再 google 搜索找到答案。 https://kotlinlang.org/docs/java-to-kotlin-interop.html#instance-fields

在var前面添加@JvmField解决了问题。

@Inject @JvmField var profileViewModel: ProfileViewModel? = null

根据 IR42,这也有效,并且在 developer.android.com 教程中使用,所以它可能更好。

@Inject lateinit var profileViewModel: ProfileViewModel