【问题标题】:Flutter - How to use shared_preferences and Settings.bundle for iOS (and what about Android?)Flutter - 如何在 iOS 上使用 shared_preferences 和 Settings.bundle(Android 呢?)
【发布时间】:2019-02-27 17:16:47
【问题描述】:

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

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

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

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

那么两个问题:

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

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

干杯!

【问题讨论】:

    标签: android ios flutter sharedpreferences


    【解决方案1】:

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

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

    -- 像往常一样创建 Flutter 首选项。 -- 在 iOS 文件夹中创建一个名为“Settings.bundle”的新 TOP 级文件夹。 Runner 文件夹中已经有其中之一,但这对我们来说并不太有用。

    -- 在 Settings.bundle 文件夹中,您需要另一个名为“en.lproj”(或您想要的任何其他语言)的子文件夹。在那个子文件夹中,您需要一个名为“Root.strings”的文件。

    -- 与 en.lproj 处于同一级别的是另一个名为“Root.plist”的文件。所以结构看起来基本上是这样的:

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

    根目录

    这就是魔法(大部分)存在的地方。事实证明,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>
    
    

    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 Settings

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

    【讨论】:

      【解决方案2】:

      对于 Android,您需要进入 android/app/src/main/res 文件夹并创建一个名为 xml 的文件夹。完成此操作后,您需要创建一个preferences.xml 文件。

      【讨论】:

        猜你喜欢
        • 2023-01-16
        • 2017-10-26
        • 1970-01-01
        • 2020-09-15
        • 2021-04-26
        • 2020-02-28
        • 2019-05-15
        • 2020-11-19
        • 2021-01-26
        相关资源
        最近更新 更多