Flutter - 如何在 iOS 上使用共享首选项和 Settings.bundle(Android 又如何?)

sjm*_*all 6 android sharedpreferences ios flutter

所以我们有一个 Flutter 应用程序 - 它有很多用户偏好。迄今为止,我们一直在使用shared_preferences插件来处理它们(就像 Flutter 领域的其他人一样)。生活很幸福。

现在,我们的 iOS 用户希望在我们的应用程序区域中看到其中一些首选项Settings.app。目前仅显示系统标准的。

我们(通过 Xcode)Settings.bundle为几个新的首选项创建了一个文件(在添加其他首选项之前)——瞧——我们在应用程序的“设置”中看到它们。但是,我们在实际的 Flutter 应用程序中没有看到它们—— - 我们仍然只能看到应用程序本身管理的“其他”首选项。

我们基本上是在调试模式下对首选项键和值进行“转储”。我们看到的只是我们在应用程序中定义的键和值。

那么两个问题:

1)我们是否遗漏了什么?查看内部代码,shared_preferences它似乎使用与使用相同的“存储”区域Settings.bundle。所以为什么我们在应用程序中没有看到这些设置首选项是令人困惑的。但我们看到了其他的。

2) Android 中无需启动应用程序即可设置应用程序首选项的等效方法是什么?我们的偏好之一只有在应用程序启动之前设置才有意义..老实说,我不是一个多产的 Android 开发人员..

干杯!

sjm*_*all 5

这是部分答案,仅适用于 iOS。仍然不知道如何在 Android 上处理这个问题(或者如果可能的话)。

如果您想在应用程序的“设置”应用程序中设置可查看和可更改的首选项,则基本上需要执行一个额外步骤。一般整体步骤为:

-- 像平常一样创建您的 Flutter 首选项。-- 在 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
Run Code Online (Sandbox Code Playgroud)

根目录

这里是魔法(大部分)存在的地方。事实证明,flutter 会自动添加前缀“flutter”。您使用的所有首选项名称。这就是秘密。这是 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>

Run Code Online (Sandbox Code Playgroud)

根字符串

这包含根据语言在应用程序的设置文件中使用的翻译字符串。这非常简单。同样,来自同一个样本:

/* 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";
Run Code Online (Sandbox Code Playgroud)

在 flutter 应用程序中,您可以使用正常的共享首选项用法 - 只需记住删除“flutter”即可。来自应用程序内的前缀。

这是一篇不错的文章的链接,其中包含有关 iOS 设置的更多信息: iOS 设置

希望这可以帮助您解决这个小难题!现在如果我们能弄清楚 Android 的话!