课程名称:Flutter从入门到进阶 实战携程网App 一网打尽核心技术
课程章节:Flutter进阶提升:网络编程与数据存储技术
课程讲师:CrazyCodeBoy
课程内容
数据存储是开发APP必不可少的一部分,比如页面缓存,从网络上获取数据的本地持久化等。
shared_preferences
shared_preferences是一个本地数据存取的插件,具有以下特点:
- 简单的,异步的,持久化的key-value存储系统;
- 在Android上是基于SharedPreferences实现的;
- 在iOS上基于NSUserDefaults的;
使用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封装一个通用而且使用更简单的库。