java - 使用 Dagger + 解析服务器 SDK : java. lang.IllegalArgumentException

标签 java android kotlin dagger dagger-hilt

目前,我正在开发一个项目,我尝试同时使用 dagger (hilt) 和 parseServer SDK。问题是,在我看来,不可能在一个项目中使用这种组合......
以下是我对为什么我认为这是不可能的看法,至少在方式上并且知道我希望它是怎样的:
使用 Parse SDK 并创建类时,您必须使用 @ParseClasssName("YourDBClassName") 对其进行注释.此自定义类必须在 onCreate() 中注册与 ParseObject.registerSubclass(YourClassName::class.java)在调用 Parse.initialize... 之前.
现在我的问题来了:当使用 dagger (hilt) 并创建这个 customClass 时,它必须注入(inject) @Inject lateinit var YourClassName在调用 onCreate() 之前.但是当你 inject这个 customClass 在调用 onCreate() 之前parse 抛出一个错误,因为 1. 它不知道这个类是 customClass 和 2. ParseObject 必须在 onCreate() 中创建。方法。
为了更清楚一点,这是我的代码和我想要实现的目标:
自定义用户类

@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")

应用模块
@Module
@InstallIn(ApplicationComponent::class)
object ApplicationModule {

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

}
主要 Activity
@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()
当前错误堆栈
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.app, PID: 31532
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.ui.view.MainActivity}: java.lang.IllegalArgumentException: You must create this type of ParseObject using ParseObject.create() or the proper subclass.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.IllegalArgumentException: You must create this type of ParseObject using ParseObject.create() or the proper subclass.
        at com.parse.ParseObject.<init>(ParseObject.java:162)
        at com.parse.ParseObject.<init>(ParseObject.java:132)
        at com.parse.ParseUser.<init>(ParseUser.java:56)
        at com.example.app.data.model.User.<init>(User.kt:10)
        at com.example.app.data.model.User.<init>(User.kt:12)
        at com.example.app.di.modules.ApplicationModule.provideUser(ApplicationModule.kt:16)
        at com.example.app.di.modules.ApplicationModule_ProvideUserFactory.provideUser(ApplicationModule_ProvideUserFactory.java:27)
        at com.example.app.DaggerApp_HiltComponents_ApplicationC.getUser(DaggerApp_HiltComponents_ApplicationC.java:61)
        at com.example.app.DaggerApp_HiltComponents_ApplicationC.access$1000(DaggerApp_HiltComponents_ApplicationC.java:41)
        at com.example.app.DaggerApp_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl.injectMainActivity2(DaggerApp_HiltComponents_ApplicationC.java:174)
        at com.example.app.DaggerApp_HiltComponents_ApplicationC$ActivityRetainedCImpl$ActivityCImpl.injectMainActivity(DaggerApp_HiltComponents_ApplicationC.java:155)
        at com.example.app.ui.view.Hilt_MainActivity.inject(Hilt_MainActivity.java:62)
        at com.example.app.ui.view.Hilt_MainActivity.onCreate(Hilt_MainActivity.java:37)
        at com.example.app.ui.view.MainActivity.onCreate(MainActivity.kt:22)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

请注意!
  • 之前我从未使用过依赖注入(inject)
  • 我是 Dagger 新手(刀柄)
  • 我是解析sdk的新手

  • 所以有可能我只是不具备编写我想要的代码的知识。我想要做的是, Dagger (刀柄)创建用户+获取他的名字等......
    我感谢每一个帮助,谢谢!

    最佳答案

    您应该移动 registerSubclass()代码到您的application类(class)。
    您的 application类(class):

    @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()
            )
        }
    
      }
    
    在 list 文件中:-
    <application
            android:name=".App"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            ....
        
    

    关于java - 使用 Dagger + 解析服务器 SDK : java. lang.IllegalArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62727509/

    相关文章:

    java.lang.ClassNotFoundException : org. springframework.expression.ExpressionParser 问题

    java - Hibernate、MySQL、Enum 和 NULL

    java - 找不到资源错误 404

    java - 如何创建具有扩展另一个类并实现接口(interface)的类型参数的基本适配器?

    android - 如何在设置中使用Seekbar?

    java - 无法使用 tidy 和 Xpath 在 java 中检索 Web 数据

    android - Material 设计 : how to get button text to be regular case (not CAPITAL)?

    android - 静态类型语言中的生命周期方法

    java - 在 Spring 中动态注入(inject)类

    database - 在android kotlin项目中正确连接外部 Realm 数据库文件的问题