Возможно получить доступ к AndroidViewModel активности через фрагмент?Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Возможно получить доступ к AndroidViewModel активности через фрагмент?

Сообщение Anonymous »

Летом прошлого года я начал рефакторировать свое приложение для 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»