Flutter - Как использовать shared_preferences и Settings.bundle для iOS (и как насчет Android?) - PullRequest
0 голосов
/ 27 февраля 2019

Итак, у нас есть приложение для флаттера, и оно имеет множество пользовательских настроек.На сегодняшний день мы используем плагин shared_preferences для управления ими (как и все остальные во Flutter-land).Жизнь была счастлива.

Теперь наши пользователи iOS хотят видеть некоторые из этих настроек в области Settings.app для нашего приложения.В настоящее время отображаются только стандартные системные.

Мы создали (через Xcode) файл Settings.bundle для пары новых предпочтений (перед добавлением других) - и вуаля - мы видим их в настройках для нашего приложения. Однако мыНЕ видя их в реальном приложении Flutter - мы по-прежнему видим только «другие» настройки, которые управляются внутри самого приложения.

Мы в основном делаем «дамп» ключей и значений Preferences в режиме отладки ... и все, что мы видим, это те, которые мы определили в приложении ..

Итак, два вопроса:

1) Мы что-то упустили?Глядя на внутренний код для shared_preferences, он, похоже, использует ту же «область хранения», которую использует Settings.bundle. Так что почему мы не видим эти настройки параметров в приложении, это сбивает с толку ... но мы видим другие.

2) Какова эквивалентная методология в Android для установки предпочтений приложения без необходимости запуска приложения?Одно из наших предпочтений имеет смысл только настроить PRIOR на запуск приложений ... и, честно говоря, я просто не плодовитый разработчик Android ..

Ура!

1 Ответ

0 голосов
/ 28 апреля 2019

Вот частичный ответ, подходящий только для iOS.До сих пор не знаю, как справиться с этим на Android (или, если вообще возможно).

Если вы хотите настроить предпочтения, которые можно просматривать и изменять в приложении «Настройки» для вашего приложения, в принципе, вам нужен еще один дополнительный шаг.сделать.Общие общие шаги:

- Создайте настройки флаттера, как обычно.- В папке iOS создайте новую папку верхнего уровня под названием «Settings.bundle».Один из них уже есть в папке Runner, но он не слишком полезен для нас.

- в папке Settings.bundle вам нужна другая подпапка с именем "en.lproj" (или на любых других языках, которые выхочу).В этой подпапке вам нужен файл с именем "Root.strings".

- На том же уровне, что и en.lproj, находится еще один файл с именем «Root.plist».Таким образом, структура выглядит в основном так:

main_app/
    iOS/
        ...
        Settings.bundle/
            en.lproj/
                Root.strings
            Root.plist

Root.plist

Вот где живет магия (в основном).Как оказалось, флаттер автоматически добавляет префикс «флаттер».все имена предпочтений, которые вы используете.Это секрет.Итак, вот пример Root.plist.Обратите внимание на имена ключей flutter.XXXX!

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>StringsTable</key>
    <string>Root</string>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
            <key>Title</key>
            <string>Data Location</string>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSMultiValueSpecifier</string>
            <key>Title</key>
            <string>Region</string>
            <key>Key</key>
            <string>flutter.dataSourceRegionV2</string>
            <key>DefaultValue</key>
            <string>0</string>
            <key>Titles</key>
            <array>
                <string>US/World</string>
                <string>EU</string>
                <string>Advanced</string>
            </array>
            <key>Values</key>
            <array>
                <integer>1</integer>
                <integer>2</integer>
                <integer>3</integer>
            </array>
        </dict>
        <dict>
            <key>Type</key>
            <string>PSTextFieldSpecifier</string>
            <key>Title</key>
            <string>Server</string>
            <key>Key</key>
            <string>flutter.dataSourceServerURLV2</string>
            <key>DefaultValue</key>
            <string></string>
            <key>IsSecure</key>
            <false/>
            <key>KeyboardType</key>
            <string>URL</string>
            <key>AutocapitalizationType</key>
            <string>None</string>
            <key>AutocorrectionType</key>
            <string>No</string>
        </dict>
    </array>
</dict>
</plist>

Root.strings

Содержит переведенные строки для использования в файле настроек для приложения в зависимости от языка.Это довольно просто.Опять же, из того же примера:

/* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */

"Data Location" = "Data Location";
"Region" = "Region";
"Server" = "Adv. URL";
"none given" = "none given";
"Authorization" = "Authorization";
"Username" = "Username";
"Password" = "Password";
"Advanced" = "Advanced";
"US/World" = "USA";
"EU" = "European Union";

В приложении флаттера вы используете обычное использование shared_preferences - просто не забудьте удалить «флаттер».префикс из вашего приложения.

Вот ссылка на приличную статью, которая содержит больше информации о настройках iOS в целом: Настройки iOS

Надеюсь, это поможет ваммимо этой маленькой загадки!Теперь, если бы мы могли понять, Android!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...