Flutter数据存储之shared_preferences

作者: 雇个城管打天下 | 来源:发表于2018-09-26 10:50 被阅读1196次

    前言

    做过android开发的人都知道,可以利用SharedPreferences这个轻量级的存储类来保存键值对信息,在Flutter中,我们可以使用shared_preferences库来同时支持Android和ios平台。

    参考:
    1.《Flutter中的本地存储》

    1. 《Flutter知识点:数据存储之SharedPreferences》

    2. shared_preferences 0.4.2

    使用介绍

    1. pubspec.yaml文件中添加依赖
    shared_preferences: "^0.4.2"
    

    添加的位置如图所示:


    添加依赖
    1. 安装依赖库
      执行$ flutter packages get命令

    2. 在相应文件中导入该库

    import 'package:shared_preferences/shared_preferences.dart';
    
    1. 增删改查
      增:
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString(key, value)
    prefs.setBool(key, value)
    prefs.setDouble(key, value)
    prefs.setInt(key, value)
    prefs.setStringList(key, value)
    

    其中key就是你存贮的名称,value就是你存储的值
    删:

    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.remove(key); //删除指定键
    prefs.clear();//清空键值对
    

    改:

    改和增是一样的,只需要再执行一次setXXX()方法即可覆盖之前的数据。

    查:


    查询操作的几个API

    使用示例

    image.png

    首先我们创建了一个TextField用来获取用户输入,然后我们再下面定义看了连个按钮,每当当即存储按钮都会触发save() 方法,每当点击获取按钮都会触发get()方法。
    先来看看save()方法

    save() async{
        SharedPreferences prefs = await SharedPreferences.getInstance();
        prefs.setString(mUserName, _userNameController.value.text.toString());
    }
    

    在上面save方法中我们可以看到我们给它加上了async和await关键字,因为SharedPreferences的存贮也是一个轻量级的耗时操作,所以我们也是需要在异步中进行的。
    我们使用SharedPreferences.getInstance()方法来实例化SharedPreferences对象,使用它的setString方法来存储用户输入的字符串。

    setString(key, value)
    

    接下来来看下get方法

    Future<String> get() async {
      var userName;
        SharedPreferences prefs = await SharedPreferences.getInstance();
        userName = await prefs.getString(mUserName);
      return userName;
    }
    

    在get方法中我们同样实例化了一个SharedPreferences对象,并且调用SharedPreferences的getString方法来获取我们存入的对象。
    getString(key)
    key就是我们刚才存入的值,我们通过这个值可以在本地查找到我们存入的对象并返回。
    同样的,get方法也是耗时操作,同样需要异步执行,我们使用async和await来使得get方法异步并返回了一个泛型为String的Future对象。

    Future<String> userName = get();
                             userName.then((String userName) {
                               Scaffold.of(context).showSnackBar(
                                    SnackBar(content: Text("数据获取成功:$userName")));
                             });
    

    我们使用获得的Future对象调用then()方法,当get方法执行完后就会自动触发then()方法里面的操作弹出showSnackBar。
    下面给出完整代码:

    import 'dart:async';
    
    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() {
      runApp(new MaterialApp(home: new MyApp()));
    }
    
    
    
    class MyApp extends StatelessWidget {
      final String mUserName = "userName";
      final _userNameController = new TextEditingController();
    
      @override
      Widget build(BuildContext context) {
        save() async{
            SharedPreferences prefs = await SharedPreferences.getInstance();
            prefs.setString(mUserName, _userNameController.value.text.toString());
        }
    
        Future<String> get() async {
          var userName;
    
            SharedPreferences prefs = await SharedPreferences.getInstance();
             userName = prefs.getString(mUserName);
          return userName;
        }
    
        return new Builder(builder: (BuildContext context) {
          return new Scaffold(
            appBar:  AppBar(
              title:  Text("SharedPreferences"),
            ),
            body:  Center(
              child: new Builder(builder: (BuildContext context){
                return
                    Column(
                      children: <Widget>[
                         TextField(
                          controller: _userNameController,
                          decoration:  InputDecoration(
                              contentPadding: const EdgeInsets.only(top: 10.0),
                              icon:  Icon(Icons.perm_identity),
                              labelText: "请输入用户名",
                              helperText: "注册时填写的名字"),
                        ),
                        RaisedButton(
                            color: Colors.blueAccent,
                            child: Text("存储"),
                            onPressed: () {
                              save();
                              Scaffold.of(context).showSnackBar(
                                  new SnackBar(content:  Text("数据存储成功")));
                            }),
                        RaisedButton(
                            color: Colors.greenAccent,
                            child: Text("获取"),
                            onPressed: () {
                              Future<String> userName = get();
                              userName.then((String userName) {
                                Scaffold.of(context).showSnackBar(
                                     SnackBar(content: Text("数据获取成功:$userName")));
                              });
                            }),
                      ],
                    );
              }),
            ),
          );
        });
      }
    }
    

    键值对文件存放路径

    相关文章

      网友评论

        本文标题:Flutter数据存储之shared_preferences

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