美文网首页
从零开始用flutter写一个完整应用(11):持久化储存3--

从零开始用flutter写一个完整应用(11):持久化储存3--

作者: 逃离_102 | 来源:发表于2022-07-04 11:43 被阅读0次

说明

继续上篇文章,这篇文章说说存储键值对数据。如果你要存储的键值集合相对较少,则可以用 shared_preferences 插件。
通常你需要在两个平台用原生的方式存储数据。幸运的是 shared_preferences插件可以把 key-value 保存到磁盘中。它通过封装 iOS 上的 NSUserDefaults 和 Android 上的 SharedPreferences 为简单数据提供持久化存储。下面就来说说具体的使用。

添加依赖

首先你需要添加依赖,示例如下

dependencies:
  flutter:
    sdk: flutter
  shared_preferences: "<newest version>"

保存数据

要存储数据,请使用 SharedPreferences 类的 setter 方法。 Setter方法可用于各种基本数据类型,例如 setInt、setBool 和 setString。
Setter 方法做两件事:首先,同步更新 key-value 到内存中,然后保存到磁盘中。

final prefs = await SharedPreferences.getInstance();
await prefs.setInt('counter', counter);

读取数据

要读取数据,请使用 SharedPreferences 类相应的 getter 方法。对于每一个 setter 方法都有对应的 getter 方法。例如,你可以使用 getInt、getBool 和 getString 方法。

final prefs = await SharedPreferences.getInstance();
final counter = prefs.getInt('counter') ?? 0;

移除数据

使用 remove() 方法删除数据。

final prefs = await SharedPreferences.getInstance();
await prefs.remove('counter');

完整示例

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});

  @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
  _MyHomePageState createState() => _MyHomePageState();
}

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

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

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

  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(
              '多次点击按键',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

注意

虽然使用 key-value 存储非常简单方便,但是它也有以下局限性:
只能用于基本数据类型: int、double、bool、string 和 stringList。
不适用于大量数据的存储。

存储键值对数据还是比较简单,先就写这么多,如有遗漏欢迎留言,如有错误欢迎指正,谢谢

相关文章

网友评论

      本文标题:从零开始用flutter写一个完整应用(11):持久化储存3--

      本文链接:https://www.haomeiwen.com/subject/ldtkbrtx.html