Летом прошлого года я начал рефакторировать свое приложение для Android с помощью компонентов архитектуры Android (Room, ViewModel, Livedata). < /p>
У меня есть два хранилища комнаты, один из них доступен по нескольким просмотрам (фрагментам) применения. Из-за этого я использовал AndroidViewModel , который имеет доступ к этому репозиторию и который инициализируется в моем MainActivity .
new ViewModelProvider(this).get(CanteensViewModel.class);
< /code>
В моих двух фрагментах я получил доступ к этой Viewmodel by < /p>
new ViewModelProvider(getActivity()).get(CanteensViewModel.class);
< /code>
До вчерашнего дня это работало отлично. Но затем я обновил свои зависимости и, поскольку androidx.lifecycle версия 2.2.0 это больше не работает. Я всегда получаю исключение (Siehe Edit 2): < /p>
Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor
< /code>
Итак, я проверил документы и, как я понял, я должен /теперь мог использовать < /p>
ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication()).create(CanteensViewModel.class);
< /code>
, чтобы получить мою просмотр. Но с этим подходом я не могу добавить владельца (параметр конструктора ViewModelProvider ), который приводит к проблеме, к которому я не могу получить доступ к ViewModel, которую я создал в действии изнутри своих фрагментов. Или было бы лучше воссоздать < /em> ViewModel в каждом фрагменте с помощью < /p>
ViewModelProvider.AndroidViewModelFactory.getInstance(getActivity().getApplication()).create(CanteensViewModel.class);
instead of creating it inside the Activity?
EDIT:
It seems to work, when I use the other constructor of ViewModelProvider, where a AndroidViewModelFactory is the second parameter.
new ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory.getInstance(this.getApplication())).get(CanteensViewModel.class);
делаю это в моем MainActivity Я могу получить доступ к CantEensViewModel в моем фрагменте через
new ViewModelProvider(requireActivity()).get(CanteensViewModel.class);
< /code>
edit 2 < /strong>
stacktrace для вышеупомянутого исключения: < /p>
2020-02-28 14:30:16.098 25279-25279/com.pasta.mensadd E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.pasta.mensadd, PID: 25279
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pasta.mensadd/com.pasta.mensadd.ui.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.pasta.mensadd.ui.viewmodel.CanteensViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2795)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1602)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6543)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.pasta.mensadd.ui.viewmodel.CanteensViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at com.pasta.mensadd.ui.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:7023)
at android.app.Activity.performCreate(Activity.java:7014)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2748)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1602)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6543)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.InstantiationException: java.lang.Class has no zero argument constructor
at java.lang.Class.newInstance(Native Method)
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
at com.pasta.mensadd.ui.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:7023)
at android.app.Activity.performCreate(Activity.java:7014)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2748)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2873)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1602)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6543)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
```
Подробнее здесь: https://stackoverflow.com/questions/604 ... a-fragment
Возможно получить доступ к AndroidViewModel активности через фрагмент? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение