课程名称:Flutter从入门到进阶 实战携程网App 一网打尽核心技术
课程章节:Flutter进阶提升:网络编程与数据存储技术
课程讲师:CrazyCodeBoy
数据存储是开发APP必不可少的一部分,比如页面缓存,从网络上获取数据的本地持久化等。
shared_preferences是一个本地数据存取的插件,具有以下特点:
使用shared_preferences,需要先在pubspec.yaml中导入插件
dependencies: shared_preferences: ^0.5.1+
与 Android 中的 SharedPreferences 中类似,shared_preferences也对原始的数据类型(int、string、bool、double)提供了相应的 getter 和 setter 方法。
final prefs = await SharedPreferences.getInstance(); //存储数据 prefs.setInt('counter', counter); //读取数据 final counter = prefs.getInt('counter') ?? 0;} //删除数据 prefs.remove('counter');
还可以在读写之前,检查一下数据是否存在,通过containsKey()方法,方法返回一个bool值。
prefs.containsKey("counter")
基于shared_preferences实现一个计数器效果的 demo。
void main() { runApp(MaterialApp( home: Scaffold( appBar: AppBar( title: Text('shared_preferences'), ), body: _CounterWidget(), ), )); } class _CounterWidget extends StatefulWidget { @override _CounterState createState() => _CounterState(); } class _CounterState extends State<_CounterWidget> { String countString = ''; String localCount = ''; @override Widget build(BuildContext context) { return Center( child: Column( children: <Widget>[ RaisedButton( onPressed: _incrementCounter, child: Text('Increment Counter')), RaisedButton(onPressed: _getCounter, child: Text('Get Counter')), Text( countString, style: TextStyle(fontSize: 20), ), Text( 'result:' + localCount, style: TextStyle(fontSize: 20), ), ], ), ); } _incrementCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { countString = countString + " 1"; }); int counter = (prefs.getInt('counter') ?? 0) + 1; await prefs.setInt('counter', counter); } _getCounter() async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { localCount = prefs.getInt('counter').toString(); }); } }
在使用shared_preferences时每次都需要去获取它的实例,如果多个地方用到,那么每次都要实例化一次。这样代码的可读性差,后期的维护成本也变得很高,而且还不支持存储Map类型,可以把shared_preferences封装一个通用而且使用更简单的库。