FlutterではSharedPreferences 

端末に簡単なデータを保存する際Flutterでは SharedPreferences で保存します。 これは Key value方式での保存で、AndroidDeveloperならそのまま SharedPreferences として使えます。iOSDeveloperなら NSUserDefaults がそれに相当します。

SharedPreferencesはXML形式で保存されます。 アプリケーション固有のもので、アプリのアンインストールをしたりアプリのデータを消すと消えます。

データは非同期でディスクに保存されますが、コールバック等がなく書き込みがディスクに保存されることが「絶対」には保証できないため重要なデータを保存するのには向いていません。

AndroidはUIthreadでも扱うことができましたが、flutterでは async awaitを用いた非同期取得になりますのでご注意を。

pubspec.yamlに依存関係を追加 

1
  shared_preferences: ^0.4.3

バージョンはこちらから確認してください。

その後いつも通り

flutter packages get

使ってみる 

プロジェクトを作った際に生成されるカウントアップの例を改造してSharedPreferencesに保存されるようにしてみます。

まずはコードから

コード 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0) + 1;
    });

    await prefs.setInt('counter', _counter);
  }

  Future<int> _getPrefCount() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    return (prefs.getInt('counter') ?? 0);
  }

  @override
  Widget build(BuildContext context) {
    _getPrefCount().then((value) {
      setState(() {
        _counter = value;
      });
    });
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Text(
              'You have pushed the button this many times:',
            ),
            new Text(
              '$_counter',
              style: Theme.of(context).textTheme.display1,
            ),
          ],
        ),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: new Icon(Icons.add),
      ),
    );
  }
}

インスタンスの取得方法 

非同期で取得する必要があります。 async/awaitで取得していきます。

1
    final SharedPreferences prefs = await SharedPreferences.getInstance();

値のセット 

値のセットは上でインスタンス化した SharedPreferences から setXX でセットします。これはそれぞれの型に存在します。

例ではint型をsetしています。

1
await prefs.setInt('counter', _counter);

その他のメソッド 

  • setString(String, String)
  • setStringList(String, List)
  • setBool(String,bool)
  • setInt(String, int)
  • setDouble(String, double)

すべてが Future<bool> が戻り値です。

値の取得 

値の取得は上でインスタンス化した SharedPreferences から getXX で取得します。これはそれぞれの型に存在します。

例ではint型の値をgetしています。

1
      _counter = (prefs.getInt('counter') ?? 0) + 1;

その他のメソッド 

  • getString(String)
  • getBool(String)
  • getInt(String)
  • getDouble(String)

またすべてのキーを返す getKeys() や 対応するキーの型を指定しない dynamic get(String) も存在します。

値の削除 

remove(String) メソッドが存在します。 今回例では使用していませんが使い方はset,getと同じです。