---
# System prepended metadata

title: Flutter SharedPreferences
tags: [Flutter]

---

---
title: 'Flutter SharedPreferences'
tags: Flutter
disqus: hackmd
---

<style>
.red {
  color: red;
}
.blue {
    color: blue;
}
</style>

<font size="6">Flutter SharedPreferences</font>

**目錄：**

[TOC]

## 添加依賴

```shell=
flutter pub add shared_preferences
```

## 編譯

:::warning
Flutter編譯會隨機使用port number，因此Debug時就需要固定port number來執行
:::

在啟動Flutter web時，使用固定端口(port number)

- 在網絡服務器中運行
```shell=
flutter run -d headless-server --web-port=1234
```

- 在chrome運行
```shell=
flutter run -d chrome --web-port=1234
```

## 保存數據

要存儲數據，請使用SharedPreferences類的setter 方法。Setter方法可用於各種基本數據類型，例如setInt、setBool和setString。

Setter 方法做兩件事：首先，同步更新key-value 到內存中，然後保存到磁盤中。

```dart=
// obtain shared preferences
final prefs = await SharedPreferences.getInstance();

// set value
await prefs.setInt('counter', counter);
```

## 讀取數據

要讀取數據，請使用SharedPreferences類相應的getter 方法。對於每一個setter 方法都有對應的getter 方法。例如，你可以使用getInt、getBool和getString方法。

```dart=
final prefs = await SharedPreferences.getInstance();

// Try reading data from the counter key. If it doesn't exist, return 0.
final counter = prefs.getInt('counter') ?? 0;
```

## 移除數據

使用remove()方法刪除數據。

```dart=
final prefs = await SharedPreferences.getInstance();

await prefs.remove('counter');
```

## 支持類型

雖然使用key-value 存儲非常簡單方便，但是它也有以下局限性：

只能用於基本數據類型：int、double、bool、string和stringList。

不適用於大量數據的存儲。

## 包裝

包裝成Singleton的方式，並且不需要await，使其方便使用

使用以下非常簡單的類來獲取SharedPreferences實例，而無需await
```dart=
import 'package:shared_preferences/shared_preferences.dart';

class SharedPrefs {
  static late final SharedPreferences _instance;

  static Future<SharedPreferences> init() async =>
      _instance = await SharedPreferences.getInstance();
}
```

初始化instancemay inmain()函數，如下：

```dart=
void main() async {
  // Required for async calls in `main`
  WidgetsFlutterBinding.ensureInitialized();

  // Initialize SharedPrefs instance.
  await SharedPrefs.init();

  runApp(MyApp());
}
```

重新定義方法

```dart=
// More abstraction
static const _kCounter = 'counter';

static Future<bool> setCounter(int value) =>
  _instance.setInt(_kCounter, value);

static int? getCounter() => _instance.getInt(_kCounter);

static removeCounter() => _instance.remove(_kCounter);
```

使用

```dart=
// 獲取
final counter = SharedPrefs.getCounter();

// 設定
SharedPrefs.setCounter(_counter);
```

## 查看

點擊F12查看

![](https://hackmd.io/_uploads/ryGc2Bly6.png)

檔案位置

```shell=
~/Library/Application\ Support/Google/Chrome/Default 
```

## Demo

https://github.com/imacuser111/flutter_database_example

## 參考

https://flutter.cn/docs/cookbook/persistence/key-value

https://stackoverflow.com/a/67616533