Не удалось загрузить файл библиотеки object is not an instance of declaring class
Я пытаюсь написать пример приложения с использованием компонентов архитектуры Android, но даже после нескольких дней работы я не смог заставить его работать. Это дает мне вышеупомянутое исключение.
Владелец жизненного цикла: -
23 ответа
Сделай свой конструктор public .
В моем случае причина заключалась в том, что я пытался получить общий экземпляр ViewModel в моем фрагменте незадолго до создания действия. Это происходит, когда приложение восстанавливает свое состояние после уничтожения.
- Моя ViewModel имеет открытый конструктор.
- Моя ViewModel имеет несколько аргументов. Но это абсолютно нормально, так как я использую ViewModelFactory для создания ViewModel.
- Мой фрагмент и действие использует один и тот же экземпляр ViewModel. Другими словами: Activity создает ViewModel, а фрагмент получает тот же экземпляр позже.
Код в деятельности:
Код в фрагменте:
Когда я открываю приложение в первый раз, все работает нормально: активность создает экземпляр ViewModel; Я открываю Фрагмент, который получает экземпляр ViewModel. Но когда приложение пытается восстановить свое состояние после уничтожения, сначала оно вызывает тело onCreate фрагмента, а затем тело onCreate действия. В этот момент фрагмент не может получить ViewModel, так как Activity еще не создал его.
Решение 1 . Переместите код, когда фрагмент получит ViewModel из onCreate в onViewCreated. Что хорошо, так как я наблюдаю все liveDatas в onViewCreated.
Решение 2 . Создайте экземпляр ViewModel в Activity.onCreate до вызова super.onCreate . В этом случае вы можете получить ViewModel в вашем фрагменте onCreate .
Если вы использовали viewmodel внутри своей активности, убедитесь, что ваша активность расширяет "DaggerAppCompatActivity" или нет
Изменить это на
Edited
Добавьте следующие зависимости сборки в файл Gradle (по состоянию на 22.02.2020)
Импорт внутри фрагмента
Создание viewModel. Добавьте один из следующих методов.
Примечание . Я видел, что это сделано многими способами. Я считаю, что правильный путь - использовать getDefaultViewModelProviderFactory() . Но я использовал requireActivity() .
Расширьте AndroidViewModel из своего класса ViewModel.
Я использую этот пример android-arcuitecture-component BasicSample чтобы создать новый проект, сталкиваясь с похожим журналом ошибок, обнаружил, что я не изменил имя приложения
Пожалуйста, добавьте ниже код. Это сработало для меня
Val binding = FragmentLayoutBinding.inflate (надувной, контейнер, ложь)
Val viewModel = ViewModelProvider (requireActivity (), defaultViewModelProviderFactory) .get (MainViewModel :: class.java)
Если вы используете Hilt , убедитесь, что ваша активность / фрагмент имеет аннотацию @AndroidEntryPoint
Убедитесь, что ваш ViewModel имеет конструктор только с одним параметром, т.е. Application .
У меня та же проблема, попробуйте разными способами и, наконец, я ее нашел. Это мой BASE_URL:
И это работает, так забавно, верно: ((. Я думаю, что вы должны проверить BASE URL, чтобы убедиться, что это правильный формат
В моем случае это была проблема зависимостей.
Если вы используете Livedata ,,
В моем случае мне нужно было использовать ListItemViewModelFactory для передачи параметра в мою модель представления.
Если вы используете Hilt, не забудьте добавить эти четыре зависимости.
Примечание: - Если какая-либо из этих зависимостей отсутствует, вы получите ошибку Cannot create an instance of class ViewModel
Есть несколько причин, чтобы бросить исключение. Я упомянул некоторые из них ..
Убедитесь, что ваш конструктор класса модели представления является общедоступным
Убедитесь, что вы добавили зависимость в свой файл сетки для жизненный цикл также, если вы используете комнату и другие библиотеки, которые вы добавили ..
Это было не совсем очевидно для меня, но когда я получил эту ошибку, я решил ее, создав открытый конструктор. Мой конструктор был получен из примеров разработчиков Android и содержал хранилище в качестве параметра. Создание дополнительного конструктора, который был пустым без параметров и общедоступным, решил проблему.
Т.е. в вашем случае
Я получил это после перехода на AndroidX.
В androidx.lifecycle:lifecycle-viewmodel:2.0.0-beta01 есть ошибка, из-за которой Proguard удаляет конструктор.
Исправьте путем обновления до 2.0.0, и не забудьте обновить правила Proguard, если это необходимо.
Если вы используете Kotlin , обязательно замените annotationProcessor в build.gradle на kapt .
apply plugin: 'kotlin-kapt' поверх файла buidl.gradle .
- В основном, Solution делает класс и конструктор общедоступными, как и другие ответы.
- Это также может быть ошибка во время выполнения, проверьте журналы ошибок Logcat, если есть несколько причин в списке.
Сделайте класс ViewModel и конструктор общедоступными
Моя проблема заключалась в том, что среда IDE добавила модификатор abstract в мой класс ViewModel.
Если ваш класс PostViewModel является внутренним классом, убедитесь, что он открытый и статический
Я пытаюсь опубликовать List пользовательские объекты. Мой JSON в теле запроса таков:
Код на стороне сервера, обрабатывающий запрос:
Но возникает исключение:
Проблема в JSON - по умолчанию он не может быть десериализован в Collection массив, потому что на самом деле это не массив JSON - это будет выглядеть так:
Поскольку вы не контролируете точный процесс десериализации (это делает RestEasy), первым вариантом было бы просто ввести JSON как a, String а затем взять под контроль процесс десериализации:
Вы бы немного потеряли удобство, не делая этого самостоятельно, но вы легко решите проблему.
Другой вариант - если вы не можете изменить JSON - было бы создать оболочку, соответствующую структуре вашего ввода JSON, и использовать ее вместо Collection<COrder> .
Надеюсь это поможет.
Отлично, я завернул в коллекцию, потому что в документации Resteasy был пример, но он был с XML. @isah nice, не могли бы вы поделиться этой рестайлинговой ссылкой, пожалуйста подумать об этом. Я почти уверен, что у меня есть правильный код, и я отлаживаю его часами и по ходу меняю свои коды. Оказывается, мне просто не хватало квадратных скобок, чтобы указать, что мой пост представляет собой массив. Arrg. Думаю, это проклятие новичков, LOL. Всем, кто плохо знаком с JSON и Spring Data, не идите по моим стопам. :( Код не работает для меня, в контроллере какой должен быть ожидаемый код?Вместо документа JSON вы можете обновить объект ObjectMapper, как показано ниже:
Это будет работать:
Проблема может возникнуть, когда вы пытаетесь прочитать список с одним элементом как JsonArray, а не JsonNode, или наоборот.
Поскольку вы не можете точно знать, содержит ли возвращаемый список один элемент (поэтому json выглядит так ) или несколько элементов (а json выглядит так [<. >, <. >] ) - вам нужно будет проверить во время выполнения тип элемента.
Должно получиться так:
(Примечание: в этом примере кода я использую com.fasterxml.jackson)
В связи с ответом Евгения вы можете решить этот конкретный случай, создав объект POJO-оболочки, который содержит в Collection<COrder> качестве своей переменной-члена. Это правильно поможет Джексону поместить фактические Collection данные в переменную-член POJO и создать JSON, который вы ищете в запросе API.
Затем установите тип параметра COrderRestService.postOrder() как вашу новую ApiRequest оболочку POJO вместо Collection<COrder> .
В эти дни я столкнулся с той же проблемой, и, возможно, некоторые подробности могут быть полезны кому-то другому.
Я искал некоторые рекомендации по безопасности для REST API и преодолел очень интригующую проблему с массивами json. Проверьте ссылку для получения подробной информации, но в основном вы должны заключить их в объект, как мы уже видели в этом вопросе публикации.
Желательно, чтобы мы всегда делали:
Это довольно просто, когда вы выполняете GET , но может вызвать некоторые проблемы, если вместо этого вы попытаетесь выполнить POST / PUT тот же самый json.
В моем случае у меня было более одного GET, который был списком, и более одного POST / PUT , которые получали бы один и тот же json.
В итоге я использовал очень простой объект Wrapper для списка :
Сериализация моих списков была произведена с помощью @ControllerAdvice :
Итак, все списки и карты были обернуты поверх объекта данных, как показано ниже:
Десериализация по-прежнему была по умолчанию, просто использовался объект de Wrapper :
Вот и все! Надеюсь, это кому-то поможет.
Примечание: протестировано с помощью SpringBoot 1.5.5.RELEASE .
по алгоритму вроде все понятно: метод buildNode вызывает либо SingleTag либо PairedTag . К примеру, возьмем PairedTag .
где класс Node описан в файле Node так: class Node< constructor(name) < this.name = name; >>
файл Node.js
файл PairedTag
OUTPUT:
- Node.js - нет экспорта
- Что с атрибутами у одиночных тегов?
Экспорт класса делается стандартно, как и всех прочих значений. export class Node - простой экспорт не подойдёт, потому что в модулях тегов делается импорт значения по умолчанию.
спасибо за подсказку, благодаря ей решение найдено. Но остались вопросы
в следующем видео "Функции как объекты" не прошло и минуты как было сказано что метод toString() по умолчанию существует в функции и возвращает её тело. Получается, мы переопределили этот встроенный метод. Но зачем?
рекомендуется писать без "расширения", как в первом варианте
записать свойство nameчерез super(name); а только через super(name); ?
не совсем понятна формулировка вопроса
Всегда думал, что есть выбор наследовать свойство от родительского класса или же переопределить его.
если в родительском классе есть конструктор, то в конструкторе дочернего классы вы обязаны вызвать его самым первым super() , в противном случае в дочернем классе не создастся this и сконструировать объект не получится. После этого вы можете записывать любые необходимые свойств в создаваемый объект через this .
в перечисленных вами модулях вы пишите свой код, функции. Тестируются же они в специальном модуле (в данном случае, это solution.test.js ), в котором происходят все необходимые для проверки правильности работы вызовы. Можете изучить.
метод toString() по умолчанию существует в функции и возвращает её тело. Получается, мы переопределили этот встроенный метод. Но зачем?
в данном случае toString записывается в специальное свойство prototype, являющееся объектом, хранящим свойства, которыми может воспользоваться создаваемый объект.
спасибо за разъяснение. Интересное ощущение, когда приходит понимание решения, но одновременно есть неприятное чувство, что все это с таким трудом приобретенное знание улетучится через пару дней без закрепления на практике.(
Ничего страшного, этот процесс требует нескольких заходов.
Добрый день! Прошу прощения за беспокойство, коллеги. Пишу простенькие скрипты на js. Прикручиваю по отдельности компоненты Bootstrap 5:
по алгоритму вроде все понятно: метод buildNode вызывает либо SingleTag либо PairedTag . К примеру, возьмем PairedTag .
где класс Node описан в файле Node так: class Node< constructor(name) < this.name = name; >>
файл Node.js
файл PairedTag
OUTPUT:
- Node.js - нет экспорта
- Что с атрибутами у одиночных тегов?
Экспорт класса делается стандартно, как и всех прочих значений. export class Node - простой экспорт не подойдёт, потому что в модулях тегов делается импорт значения по умолчанию.
спасибо за подсказку, благодаря ей решение найдено. Но остались вопросы
в следующем видео "Функции как объекты" не прошло и минуты как было сказано что метод toString() по умолчанию существует в функции и возвращает её тело. Получается, мы переопределили этот встроенный метод. Но зачем?
рекомендуется писать без "расширения", как в первом варианте
записать свойство nameчерез super(name); а только через super(name); ?
не совсем понятна формулировка вопроса
Всегда думал, что есть выбор наследовать свойство от родительского класса или же переопределить его.
если в родительском классе есть конструктор, то в конструкторе дочернего классы вы обязаны вызвать его самым первым super() , в противном случае в дочернем классе не создастся this и сконструировать объект не получится. После этого вы можете записывать любые необходимые свойств в создаваемый объект через this .
в перечисленных вами модулях вы пишите свой код, функции. Тестируются же они в специальном модуле (в данном случае, это solution.test.js ), в котором происходят все необходимые для проверки правильности работы вызовы. Можете изучить.
метод toString() по умолчанию существует в функции и возвращает её тело. Получается, мы переопределили этот встроенный метод. Но зачем?
в данном случае toString записывается в специальное свойство prototype, являющееся объектом, хранящим свойства, которыми может воспользоваться создаваемый объект.
спасибо за разъяснение. Интересное ощущение, когда приходит понимание решения, но одновременно есть неприятное чувство, что все это с таким трудом приобретенное знание улетучится через пару дней без закрепления на практике.(
Ничего страшного, этот процесс требует нескольких заходов.
Добрый день! Прошу прощения за беспокойство, коллеги. Пишу простенькие скрипты на js. Прикручиваю по отдельности компоненты Bootstrap 5:
Читайте также: