Не удается разрешить конструкцию ViewModelProvider во фрагменте?

Я потратил много времени, пытаясь понять, почему 9X_android-ui в приведенном ниже коде (ближе к концу) я 9X_android-ui получаю сообщение об ошибке ViewModelProvider 9X_android (это). Я также попробовал getActivity() вместо 9X_android this, та же проблема. Я получаю сообщение 9X_android-architecture-components об ошибке «Не удается разрешить конструктор 9X_android-livedata ...»

 import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; public class ItemSetupFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_setup, container, false); return view; } @Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); ItemSetupFragmentModel model = new ViewModelProvider(this).get(ItemSetupFragmentModel.class); model.getKids().observe(this, users -> { // update UI }); } } 

9X_Не удается разрешить конструкцию ViewModelProvider во фрагменте?_android-architecture-components

17
0
3
Общее количество ответов: 3

Ответ #1

Ответ на вопрос: Не удается разрешить конструкцию ViewModelProvider во фрагменте?

Во-первых, вам необходимо использовать последнюю 9X_android-mvvm версию расширения жизненного цикла. Должно 9X_android быть:

implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0' implementation "androidx.lifecycle:lifecycle-viewmodel:2.2.0" 

или любой обновленной версии.

Тогда 9X_android вы должны использовать requireActivity() вместо getActivity(). Таким образом 9X_android-sdk вы убедитесь, что действие прикреплено и 9X_android-sdk не получит NullPointerException.

ItemSetupFragmentModel model = new ViewModelProvider(requireActivity()).get(ItemSetupFragmentModel.class); 

Примечание. ViewModel Overview и Declaring Dependencies

Мне пришлось перезапустить 9X_android кеш после добавления библиотеки в файл Gradle. Нет 9X_android-architecture-components необходимости использовать requireActivity(), достаточно 9X_android-arch this.

45
0

Ответ #2

Ответ на вопрос: Не удается разрешить конструкцию ViewModelProvider во фрагменте?

Вы не используете последнюю версию библиотеки, в 9X_android-ui которую был включен конструктор ViewModelProvider(@NonNull ViewModelStoreOwner owner). Вы просматриваете 9X_android-sdk последние версии документации, но не используете 9X_android-ui последнюю версию библиотеки ViewModel. Вам нужно 9X_livedata использовать

 implementation 'androidx.lifecycle:lifecycle-viewmodel:2.2.0' // For Java 

или

 implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0' // For kotlin extension 

7
0

Ответ #3

Ответ на вопрос: Не удается разрешить конструкцию ViewModelProvider во фрагменте?

Самая чистая реализация должна использовать 9X_livedata Kotlin для своих расширенных функций. Вы 9X_livedata можете либо создать этот код kotlin в отдельном 9X_livedata классе Kclass, либо оставить этот ответ 9X_android-architecture-components для будущих пользователей, которые хотят 9X_livedata знать, как это сделать в Kotlin. Обычно 9X_android-livedata мы инициализируем ViewModel ленивым способом:

Убедитесь, что 9X_android-ui у вас есть эта зависимость:

implementation "androidx.fragment:fragment-ktx:1.2.0" 

Создайте эту 9X_android-livedata вспомогательную функцию, которая обращается 9X_android-arch к внутреннему методу фрагмента-ktx, который 9X_android-livedata позволяет вам лениво создавать экземпляр 9X_android-ui ViewModel:

@MainThread inline fun Fragment.fragmentViewModel() = createViewModelLazy( VM::class, { this.viewModelStore }, { ViewModelFactory(Database.getDatabase(requireContext().applicationContext)) } ) 

Теперь создайте ViewModelFactory, используя 9X_android-sdk этот официальный пример java:

https://github.com/android/architecture-components-samples/blob/master/BasicRxJavaSample/app/src/main/java/com/example/android/observability/ui/ViewModelFactory.java

Или вот вариант 9X_livedata Котлина:

class ViewModelFactory(private val database: Database?) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { requireNotNull(database) { "Database must not be null" } return when { modelClass.isAssignableFrom(ItemSetupFragmentModel::class.java) -> { ItemSetupFragmentModel() as T } else -> { throw IllegalArgumentException("Unknown ViewModel class") } } } } 

А теперь войдите в свой фрагмент 9X_android-arch и просто инициализируйте свою ViewModel 9X_android-architecture-components следующим образом

class ItemSetupFragment : Fragment() { private val model by viewModel() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) model.getKids().observe(this, users -> { // update UI }); } } 

Надеюсь, это поможет!

2
0