Skip to content
On this page

使用首选项API

存储用户配置和值是应用程序开发人员的一项常见任务,但在多个平台上实现它可能会非常繁琐和耗时。为了更简单,Fyne提供了一个API,用于在处理复杂部分时以清晰易懂的方式在文件系统上存储值。

让我们从API的设置开始。它是Preferences界面的一部分,其中存在Bool、Float、Int和String值的存储和加载函数。它们分别由三个不同的函数组成,一个用于加载,一个使用回退值加载,最后一个用于存储值。下面可以看到String类型的三个函数及其行为的示例:

go
// String looks up a string value for the key
String(key string) string
// StringWithFallback looks up a string value and returns the given fallback if not found
StringWithFallback(key, fallback string) string
// SetString saves a string value for the given key
SetString(key string, value string)

可以通过创建的应用程序变量并调用上的Preferences()方法来访问这些函数。请注意,有必要创建具有唯一ID的应用程序(通常类似于反向url)。这意味着需要使用app.NewWithID()创建应用程序,以便有自己的位置来存储值。它可以大致使用如下示例:

go
a := app.NewWithID("com.example.tutorial.preferences")
[...]
a.Preferences().SetBool("Boolean", true)
number := a.Preferences().IntWithFallback("ApplicationLuckyNumber", 21)
expression := a.Preferences().String("RegularExpression")
[...]

为了展示这一点,我们将构建一个简单的小应用程序,它总是在一段时间后关闭。该超时应可由用户更改,并在下次启动应用程序时应用。

让我们首先创建一个名为timeout的变量,该变量将用于以time.Duration的形式存储时间。

go
var timeout time.Duration

然后我们可以创建一个选择小部件,让用户从几个预定义的字符串中选择超时,然后将超时乘以字符串相关的秒数。最后,使用“AppTimeout”键将字符串值设置为选定的值。

go
timeoutSelector := widget.NewSelect([]string{"10 seconds", "30 seconds", "1 minute"}, func(selected string) {
    switch selected {
    case "10 seconds":
        timeout = 10 * time.Second
    case "30 seconds":
        timeout = 30 * time.Second
    case "1 minute":
        timeout = time.Minute
    }

    a.Preferences().SetString("AppTimeout", selected)
})

现在我们要获取设置值,如果没有设置值,我们希望有一个回退,将超时设置为尽可能短的值,以节省用户等待时的时间。这可以通过将timeoutSelector的选定值设置为已加载值或回退(如果情况正好如此)来完成。通过这样做,select小部件中的代码将针对该特定值运行。

go
timeoutSelector.SetSelected(a.Preferences().StringWithFallback("AppTimeout", "10 seconds"))

最后一部分将是有一个函数,它在一个单独的goroutine中启动,并告诉应用程序在选定的超时后退出。

go
go func() {
    time.Sleep(timeout)
    a.Quit()
}()

最后,生成的代码应该是这样的:

go
package main

import (
    "time"

    "fyne.io/fyne/v2/app"
    "fyne.io/fyne/v2/widget"
)

func main() {
    a := app.NewWithID("com.example.tutorial.preferences")
    w := a.NewWindow("Timeout")

    var timeout time.Duration

    timeoutSelector := widget.NewSelect([]string{"10 seconds", "30 seconds", "1 minute"}, func(selected string) {
        switch selected {
        case "10 seconds":
            timeout = 10 * time.Second
        case "30 seconds":
            timeout = 30 * time.Second
        case "1 minute":
            timeout = time.Minute
        }

        a.Preferences().SetString("AppTimeout", selected)
    })

    timeoutSelector.SetSelected(a.Preferences().StringWithFallback("AppTimeout", "10 seconds"))

    go func() {
        time.Sleep(timeout)
        a.Quit()
    }()

    w.SetContent(timeoutSelector)
    w.ShowAndRun()
}