使用匕首柄+解析服务器SDK:java.lang.IllegalArgumentException

时间:2020-07-04 09:34:45

标签: java android kotlin dagger dagger-hilt

当前,我正在一个项目中尝试同时使用dagger(hilt)和parseServer SDK。问题是我认为不可能在一个项目中使用这种组合...

以下是我的看法,为什么我认为这是不可能的,至少在某种程度上,并且知道我希望做到这一点:

在使用Parse SDK并创建类时,必须使用@ParseClasssName("YourDBClassName")对其进行注释。调用onCreate()之前,必须在ParseObject.registerSubclass(YourClassName::class.java)中向Parse.initialize...注册该自定义类。

现在出现了我的问题:使用匕首(hilt)并创建此customClass时,必须在调用@Inject lateinit var YourClassName之前将其插入onCreate()中。但是,当您在调用inject解析之前onCreate()调用此customClass时,会引发错误,因为1.它不知道此类是一个customClass,并且2.必须在{{1 }}方法。

为了更清楚一点,这是我的代码以及我想要实现的目标:

自定义用户类别

onCreate()

ApplicationModule

@ParseClassName("User")
data class User(var name: String, var passWord: String, var eMail: String) : ParseUser() {

    @Inject constructor(): this("","","")

    // Creates a new User
    fun signUpWithOutVerification() = apply {
        username = name
        setPassword(passWord)
        email = eMail
        signUpInBackground()
    }

    // logIn
    fun logIn() = logInInBackground(name, passWord) ?: Timber.e("logIn Error")

    // logOut
    fun logOut() = logOutInBackground() ?: Timber.e("logOut Error")

    // Update
    fun updateCredential(key: String, value: Any) = getCurrentUser().apply {
        put(key, value)
        saveInBackground()
    } ?: Timber.e("Update failed")

    // Delet and Logout
    fun deleteUser() = getCurrentUser().apply {
        deleteInBackground()
        logOut()
    } ?: Timber.e("Delete failed")

MainActivity

@Module
@InstallIn(ApplicationComponent::class)
object ApplicationModule {

    @Provides
    @Singleton
    fun provideUser() = User()

}

MainApp

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var user: User


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

        ParseObject.registerSubclass(User::class.java)

        Parse.initialize(
            Parse.Configuration.Builder(this)
            .applicationId("YourAppKey")
            .clientKey("YourClientKey")
            .server("https://parseapi.back4app.com")
            .build()
        )

        Timber.plant(Timber.DebugTree())

        lateinit var userName: String
        lateinit var userPw: String

        btn_signup.setOnClickListener {
            userName = etName.text.toString()
            userPw = etPassword.text.toString()
            user.apply{
                name = userName
                passWord = userPw
                eMail = "$userName@email.com"
                signUpWithOutVerification()
            }

        }

当前错误堆栈

@HiltAndroidApp
class App : Application()

请注意!

  1. 我以前从未使用过依赖注入
  2. 我是匕首的新手(hilt)
  3. 我是解析sdk的新手

因此,我可能不具备编写所需代码的知识。我想做的是,用匕首(hilt)创建User +并获取其Name等...

感谢您的帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

您应将registerSubclass()代码移至application类。

您的application课程:

@HiltAndroidApp
class App : Application() {

 override fun onCreate() {
        super.onCreate()
       
ParseObject.registerSubclass(User::class.java)

        Parse.initialize(
            Parse.Configuration.Builder(this)
            .applicationId("YourAppKey")
            .clientKey("YourClientKey")
            .server("https://parseapi.back4app.com")
            .build()
        )
    }

  }

在清单文件中:-

<application
        android:name=".App"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        ....