Flutter getApplicationDocumentsDirectory() не работает должным образом на Android, но работает нормально на iOS/iPadOSAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Flutter getApplicationDocumentsDirectory() не работает должным образом на Android, но работает нормально на iOS/iPadOS

Сообщение Anonymous »


--- Важное обновление ---

После многих часов экспериментов я узнал больше о том, что, по моему мнению, изменилось.

Поскольку я не очень хорошо знаком с Android, я предполагал (теперь это кажется ошибочным), что система сборки Flutter для Android предпримет необходимые действия в отношении свойства версии Flutter в pubspec.yaml, как это происходит для iOS, но кажется Я ошибся.

За последние 2 года я выпустил сборки своего приложения, в которых свойство версии Flutter изменилось с «1.0.0+1» на «1.0.0+2», «1.0.0+3», «1.0. 1+1» и так до «1.1.4+9», и все заработало так, как я ожидал. Однако до сих пор я не понимал, что при обновлении с «1.0.0+3» до «1.0.1+1» Android обнаружил INSTALL_FAILED_VERSION_DOWNGRADE, потому что код версии для Flutter-версии моего приложения — «1.0.1». +1' — это 1, а код версии для предыдущей версии приложения — «1.0.0+3» — был 3, поэтому Android подумал, что я пытаюсь перейти с версии 3 на версию 1.

Вы можете видеть это в выводе, который я опубликовал в своем исходном вопросе, потому что, когда я пытаюсь обновить до «1.1.5+1» с «1.1.4+9», вы можете увидеть ошибку, поскольку 1 меньше 9:

Ошибка: выход из ADB с кодом выхода 1 Выполнение потоковой установки adb: не удалось установить /Users/les/.../build/app/outputs/flutter-apk/app-debug.apk: ошибка [INSTALL_FAILED_VERSION_DOWNGRADE: результат проверки пакета] Насколько я понимаю, изменилось то, что до недавнего времени при «понижении версии» пользовательские данные старого приложения не удалялись, а теперь удаляются, но почему это так?

Если это изменение не является ошибкой и считается к лучшему, означает ли это, что разработчикам Flutter для iOS и Android необходимо иметь разные свойства версии для каждой платформы или изменить сгенерированный Flutter android/app/build. gradle для вычисления полезного кода версии Android на основе свойства версии Flutter приложения (это то, что я решил сделать, чтобы обойти эту проблему).

Если я не правильно понял, что здесь происходит, то я был бы очень признателен, если бы кто-нибудь объяснил это правильно, чтобы я мог предпринять правильные действия.

Большое спасибо

Лес.

--- Оригинальный вопрос ---

Извиняюсь за этот длинный пост, но я просмотрел все остальные вопросы getApplicationDocumentsDirectory здесь, и ни один из них, похоже, не описывает мою проблему, и я надеюсь, что кто-нибудь поможет мне попытаться исправить это.

Я работаю над приложением уже больше года, и до сих пор у меня не было проблем с хранением в приложении данных, созданных пользователем, на их устройстве. Но теперь, когда я пытаюсь обновить свое приложение на Android, оно не видит никаких данных из предыдущей версии приложения, но на iOS/iPadOS все работает как обычно!

Я использую MacOS Ventura (13.6), VSCode (1.82.2) и Flutter 3.13.6, и у меня есть два отдельных окна в VSCode: одно для версии 1.1.4+9 моего приложения и одно для версии 1.1.5+1 (каждое окно находится в отдельном репозитории git).

Каждая версия имеет один и тот же файл main.dart, и вот код, который, похоже, вызывает у меня проблему:

Future main() async { FlutterError.onError = (подробности FlutterErrorDetails) async { окончательное исключение = детали.исключение; окончательный stackTrace = Details.stack ?? StackTrace.пустой; если (isInDebugMode) { FlutterError.dumpErrorToConsole(подробнее); } еще { Zone.current.handleUncaughtError(исключение, stackTrace); } }; runZonedGuarded(() async { ВиджетыFlutterBinding.ensureInitialized(); вар дир = ждут getApplicationDocumentsDirectory(); ждут Hive.initFlutter(dir.path); // регистрируем адаптеры типов Hive для наших перечислений... Hive.registerAdapter(RandomNumberTypeAdapter()); Hive.registerAdapter(DamageTableOptionAdapter()); Hive.registerAdapter(PilotRatingTypeAdapter()); дождитесь openGameFiles(); дождитесь initSettings(); Я запускаю одиночный эмулятор Android с помощью Genymotion или Android Studio, а затем запускаю сеанс отладки с использованием версии 1.1.4 с точкой останова здесь:

await Hive.initFlutter(dir.path); Это сделано для того, чтобы я мог просмотреть каталог ApplicationDocumentsDirectory. и я вижу следующее в КОНСОЛИ ОТЛАДКИ VSCode:

Запуск lib/main.dart на Pixel 3 в режиме отладки... Примечание. Некоторые входные файлы используют или переопределяют устаревший API. Примечание. Для получения подробной информации перекомпилируйте с параметром -Xlint:deprecation. ✓ Создан build/app/outputs/flutter-apk/app-debug.apk. Подключение к службе виртуальной машины по адресу ws://127.0.0.1:54668/tAp30o9icjc=/ws. реж. _Directory (Каталог: '/data/user/0/info.larsj.tft_01/app_flutter') _path: "/data/user/0/info.larsj.tft_01/app_flutter" _rawPath: Uint8List (43 элемента) абсолютное: _Directory (Каталог: '/data/user/0/info.larsj.tft_01/app_flutter') хэш-код: 925209278 isAbsolute: правда родительский элемент: _Directory (Каталог: '/data/user/0/info.larsj.tft_01') путь: «/data/user/0/info.larsj.tft_01/app_flutter» runtimeType: Тип (_Directory) uri: _Uri (файл:///data/user/0/info.larsj.tft_01/app_flutter/) реж.listSync() Список (22 позиции) [0]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/mytftbox.lock') [1]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/mytftbox.hive') [2]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cmpgn1.lock') [3]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/citye.lock') [4]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cmpgn5.hive') [5]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cityi.lock') [6]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cmpgn3.hive') [7]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cmpgn6.lock') [8]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/cmpgn2.hive') [9]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/gamebox.lock') [10]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/gamebox.hive') [11]: _Файл [12]: _Каталог [13]: _Файл [14]: _Файл [15]: _Файл [16]: _Файл [17]: _Файл [18]: _Файл [19]: _Файл [20]: _Файл [21]: _Файл Теперь я останавливаю сеанс отладки в окне 1.1.4 и запускаю сеанс отладки из окна 1.1.5, используя тот же экземпляр эмулятора и ту же точку останова, и вот что я вижу в КОНСОЛИ ОТЛАДКИ:

Запуск lib/main.dart на Pixel 3 в режиме отладки... Примечание. Некоторые входные файлы используют или переопределяют устаревший API. Примечание. Для получения подробной информации перекомпилируйте с параметром -Xlint:deprecation. ✓ Создан build/app/outputs/flutter-apk/app-debug.apk. Удаление старой версии... Ошибка: выход из ADB с кодом выхода 1. Выполнение потоковой установки adb: не удалось установить /Users/les/.../build/app/outputs/flutter-apk/app-debug.apk: ошибка [INSTALL_FAILED_VERSION_DOWNGRADE: результат проверки пакета] Подключение к службе виртуальной машины по адресу ws://127.0.0.1:55046/Ki5K48e3ahk=/ws. реж. _Directory (Каталог: '/data/user/0/info.larsj.tft_01/app_flutter') _path: "/data/user/0/info.larsj.tft_01/app_flutter" _rawPath: Uint8List (43 элемента) абсолютное: _Directory (Каталог: '/data/user/0/info.larsj.tft_01/app_flutter') хэш-код: 749014032 isAbsolute: правда родительский элемент: _Directory (Каталог: '/data/user/0/info.larsj.tft_01') путь: «/data/user/0/info.larsj.tft_01/app_flutter» runtimeType: Тип (_Directory) uri: _Uri (файл:///data/user/0/info.larsj.tft_01/app_flutter/) реж.listSync() Список (2 шт.) [0]: _File (Файл: '/data/user/0/info.larsj.tft_01/app_flutter/res_timestamp-1-1696326308216') [1]: _Directory (Каталог: '/data/user/0/info.larsj.tft_01/app_flutter/flutter_assets') Значит, все 20 файлов данных, созданных пользователями из версии 1.1.4, отсутствуют 😢

Я пробовал все перечисленное ниже, по отдельности и все вместе, и результаты всегда одни и те же:
[*]очистить оба проекта [*]удалить папки Android, а затем воссоздать их с помощью Flutter Create [*]обновление Flutter pub --major-versions
Обратите внимание, что разница между двумя файлами pubscpec.yaml показывает, что единственная разница заключается в строке «version:» (как и следовало ожидать).

Моей основной средой разработки является iMac, но я также выполнил новую установку на MBP 15, и результаты одинаковы на обеих платформах.

Могу ли я еще что-нибудь попытаться выяснить, что может быть причиной этого?

Спасибо

Ле
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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