element-hq / element-android

A Matrix collaboration client for Android.
https://element.io/
GNU Affero General Public License v3.0
3.34k stars 711 forks source link

add new fragment. #2476

Closed Alvazz closed 2 years ago

Alvazz commented 3 years ago

I wan add new fragment to Element-android

like this:

private fun updateSelectedFragment(displayMode: PageDisplayMode) {
        val fragmentTag = "FRAGMENT_TAG_${displayMode.name}"
        val fragmentToShow = childFragmentManager.findFragmentByTag(fragmentTag)
        childFragmentManager.commitTransaction {
            childFragmentManager.fragments
                    .filter { it != fragmentToShow }
                    .forEach {
                        detach(it)
                    }
            if (fragmentToShow == null) {
                val params = NewHomeMainListParams(displayMode)
                if(displayMode.name == "NEWHOME"){
                    add(R.id.newHomeMainListContainer, NewHomeMainListFragment::class.java, params.toMvRxBundle(), fragmentTag)
                }else {
                    // here
                    add(R.id.newHomeMainListContainer, SquareFragment::class.java, params.toMvRxBundle(), fragmentTag)
                }

            } else {
                attach(fragmentToShow)
            }
        }
    }

when I running the app, then crash.

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.bbai.android.chita.debug, PID: 7951
    java.lang.RuntimeException: Failed to call observer method
        at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:226)
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:194)
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:185)
        at androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:37)
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2942)
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:273)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2088)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: java.lang.IllegalStateException: Failed to create initial state!
        at com.airbnb.mvrx.MvRxStateFactoryKt.createStateFromConstructor(MvRxStateFactory.kt:83)
        at com.airbnb.mvrx.RealMvRxStateFactory.createInitialState(MvRxStateFactory.kt:28)
        at com.airbnb.mvrx.MvRxFactoryKt.createViewModel(MvRxFactory.kt:45)
        at com.airbnb.mvrx.MvRxFactoryKt.access$createViewModel(MvRxFactory.kt:1)
        at com.airbnb.mvrx.MvRxFactory.create(MvRxFactory.kt:26)
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
        at com.airbnb.mvrx.MvRxViewModelProvider.get(MvRxViewModelProvider.kt:63)
        at com.airbnb.mvrx.MvRxViewModelProvider.get$default(MvRxViewModelProvider.kt:38)
        at im.vector.app.features.newhome.square.SquareFragment$$special$$inlined$fragmentViewModel$1.invoke(MvRxExtensions.kt:27)
        at im.vector.app.features.newhome.square.SquareFragment$$special$$inlined$fragmentViewModel$1.invoke(Unknown Source:0)
        at com.airbnb.mvrx.lifecycleAwareLazy.getValue(lifecycleAwareLazy.kt:53)
        at com.airbnb.mvrx.lifecycleAwareLazy$1.onStart(lifecycleAwareLazy.kt:31)
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:216)
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:194) 
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:185) 
        at androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:37) 
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354) 
        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265) 
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307) 
        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148) 
        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134) 
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2942) 
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:273) 
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177) 
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2088) 
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990) 
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 
     Caused by: java.lang.InstantiationException: java.lang.Class<im.vector.app.features.newhome.square.SquareViewState> has no zero argument constructor
        at java.lang.Class.newInstance(Native Method)
        at com.airbnb.mvrx.MvRxStateFactoryKt.createStateFromConstructor(MvRxStateFactory.kt:74)
        at com.airbnb.mvrx.RealMvRxStateFactory.createInitialState(MvRxStateFactory.kt:28) 
        at com.airbnb.mvrx.MvRxFactoryKt.createViewModel(MvRxFactory.kt:45) 
        at com.airbnb.mvrx.MvRxFactoryKt.access$createViewModel(MvRxFactory.kt:1) 
        at com.airbnb.mvrx.MvRxFactory.create(MvRxFactory.kt:26) 
        at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 
        at com.airbnb.mvrx.MvRxViewModelProvider.get(MvRxViewModelProvider.kt:63) 
        at com.airbnb.mvrx.MvRxViewModelProvider.get$default(MvRxViewModelProvider.kt:38) 
        at im.vector.app.features.newhome.square.SquareFragment$$special$$inlined$fragmentViewModel$1.invoke(MvRxExtensions.kt:27) 
        at im.vector.app.features.newhome.square.SquareFragment$$special$$inlined$fragmentViewModel$1.invoke(Unknown Source:0) 
        at com.airbnb.mvrx.lifecycleAwareLazy.getValue(lifecycleAwareLazy.kt:53) 
        at com.airbnb.mvrx.lifecycleAwareLazy$1.onStart(lifecycleAwareLazy.kt:31) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.lifecycle.ClassesInfoCache$MethodReference.invokeCallback(ClassesInfoCache.java:216) 
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeMethodsForEvent(ClassesInfoCache.java:194) 
        at androidx.lifecycle.ClassesInfoCache$CallbackInfo.invokeCallbacks(ClassesInfoCache.java:185) 
        at androidx.lifecycle.ReflectiveGenericLifecycleObserver.onStateChanged(ReflectiveGenericLifecycleObserver.java:37) 
        at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354) 
        at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265) 
        at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307) 
        at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148) 
        at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134) 
        at androidx.fragment.app.Fragment.performCreate(Fragment.java:2942) 
        at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) 
        at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:273) 
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177) 
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2088) 
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990) 
        at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:223) 
        at android.app.ActivityThread.main(ActivityThread.java:7656) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 

looks like the PEOPLE and the ROOMS use the some oen fragment now.

bmarty commented 3 years ago

Ensure you have added your new Fragment to FragmentModule

Also about:

Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor

SquareViewState should have default value for every fields.

Alvazz commented 3 years ago

@bmarty I have a wrong understanding of the overall page structure. Your design is better than I thought. Great work! Give me a donation link, I want to donate 10,000 USD :D:D

bmarty commented 2 years ago

Happy to help!