<

キーと値のデータをディスクに保存する

Key-Value のコレクションが比較的小さい場合 保存するには、shared_preferencesプラグイン。

通常は、 保存するためにネイティブ プラットフォーム統合を作成する必要があります。 iOS と Android の両方のデータ。幸運、 のshared_preferencesプラグインを使用して永続化できます ディスク上のキーと値のデータ。共有設定プラグイン ラップするNSUserDefaultsiOS とSharedPreferencesアンドロイドでは、 単純なデータの永続的なストアを提供します。

このレシピでは次の手順を使用します。

  1. 依存関係を追加します。
  2. データを保存します。
  3. データを読み取ります。
  4. データを削除します。

1.依存関係を追加します

開始する前に、shared_preferencesパッケージを依存関係として追加します。

追加するには、shared_preferencesパッケージを依存関係として、 走るflutter pub add:

$ flutter pub add shared_preferences

2. データの保存

データを永続化するには、SharedPreferencesクラス。セッターメソッドは以下で利用可能です などのさまざまなプリミティブ型setIntsetBool、 とsetString

Setter メソッドは 2 つのことを行います。まず、 メモリ内のキーと値のペア。次に、データをディスクに永続化します。

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

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

3. データの読み取り

データを読み取るには、SharedPreferencesクラス。各セッターには、対応するゲッターがあります。 たとえば、次のように使用できます。getIntgetBool、 とgetString方法。

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;

4. データを削除する

データを削除するには、remove()方法。

final prefs = await SharedPreferences.getInstance();

await prefs.remove('counter');

サポートされているタイプ

Key-Value ストレージは使いやすく便利ですが、 それには制限があります:

  • プリミティブ型のみを使用できます。intdoubleboolstring、 とstringList
  • 大量のデータを保存するように設計されていません。

Android の共有設定の詳細については、 を参照してください共有設定ドキュメントAndroid 開発者の Web サイトで。

テストサポート

データを永続化するコードをテストすることをお勧めします。shared_preferences。これをモックアウトすることでこれを行うことができますMethodChannelによって使用されますshared_preferences図書館。

人口を投入するSharedPreferencesテストの初期値を使用して 次のコードを実行して、setupAll()のメソッド テストファイル:

TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
    .setMockMethodCallHandler(
        const MethodChannel('plugins.flutter.io/shared_preferences'),
        (methodCall) async {
  if (methodCall.method == 'getAll') {
    return <String, dynamic>{}; // set initial values here if desired
  }
  return null;
});

完全な例

import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of the application.
  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Shared preferences demo',
      home: MyHomePage(title: 'Shared preferences demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

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

  @override
  void initState() {
    super.initState();
    _loadCounter();
  }

  //Loading counter value on start
  Future<void> _loadCounter() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0);
    });
  }

  //Incrementing counter after click
  Future<void> _incrementCounter() async {
    final prefs = await SharedPreferences.getInstance();
    setState(() {
      _counter = (prefs.getInt('counter') ?? 0) + 1;
      prefs.setInt('counter', _counter);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}