美文网首页
从零开始用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