Flutter高性能键值存储插件mmkv的使用
Flutter高性能键值存储插件mmkv的使用
MMKV是一个高效的、小型的、易于使用的移动键值存储框架,广泛应用于微信应用中。它目前支持Android和iOS平台。本文将介绍如何在Flutter项目中使用MMKV。
特性
- 高效:MMKV使用mmap来保持内存与文件同步,并使用protobuf进行编码/解码,充分利用本地平台以实现最佳性能。
- 易于使用:所有更改立即保存,无需调用
sync
或apply
。 - 小巧:仅包含必要的文件,二进制大小约为100K。
入门指南
安装
在你的pubspec.yaml
文件中添加以下依赖:
dependencies:
mmkv: "^2.0.2"
然后运行flutter pub get
。
iOS
从v1.3.5开始,不需要再将插件名称’mmkv’更改为’mmkvflutter’。你应该删除之前在Podfile中添加的脚本(fix_mmkv_plugin_name()
)。
Android
如果你之前使用com.tencent.mmkv-static
或com.tencent.mmkv-shared
,请迁移到com.tencent.mmkv
。如果App依赖于嵌入这些库的第三方SDK,可以在build.gradle
中添加以下内容以避免冲突:
dependencies {
...
modules {
module("com.tencent:mmkv-static") {
replacedBy("com.tencent:mmkv", "Using mmkv for flutter")
}
module("com.tencent:mmkv-shared") {
replacedBy("com.tencent:mmkv", "Using mmkv for flutter")
}
}
}
设置
在应用程序启动时设置MMKV,例如在main()
函数中添加以下代码:
import 'package:mmkv/mmkv.dart';
void main() async {
final rootDir = await MMKV.initialize();
print('MMKV for flutter with rootDir = $rootDir');
runApp(MyApp());
}
注意:必须等待MMKV完成初始化后再访问任何MMKV实例。
CRUD操作
使用全局实例
import 'package:mmkv/mmkv.dart';
void main() async {
final rootDir = await MMKV.initialize();
print('MMKV for flutter with rootDir = $rootDir');
var mmkv = MMKV.defaultMMKV();
mmkv.encodeBool('bool', true);
print('bool = ${mmkv.decodeBool('bool')}');
mmkv.encodeInt32('int32', (1 << 31) - 1);
print('max int32 = ${mmkv.decodeInt32('int32')}');
String str = 'Hello Flutter from MMKV';
mmkv.encodeString('string', str);
print('string = ${mmkv.decodeString('string')}');
// 删除和查询
mmkv.removeValue('bool');
print('contains "bool": ${mmkv.containsKey('bool')}');
mmkv.removeValues(['int32']);
print('all keys: ${mmkv.allKeys}');
}
// 加密示例
var encryptKey = 'MyEncryptKey';
var mmkvEncrypted = MMKV("test-encryption", cryptKey: encryptKey);
创建独立实例
var mmkv = MMKV("test");
mmkv.encodeBool('bool', true);
print('bool = ${mmkv.decodeBool('bool')}');
多进程访问
var mmkv = MMKV("test-multi-process", mode: MMKVMode.MULTI_PROCESS_MODE);
mmkv.encodeBool('bool', true);
print('bool = ${mmkv.decodeBool('bool')}');
支持的类型
- 基础类型:
bool
,int
,double
- 类和集合:
String
,List<int>
,MMBuffer
日志
默认情况下,MMKV会打印日志到logcat/console。你可以通过设置日志级别来关闭日志:
final rootDir = await MMKV.initialize(logLevel: MMKVLogLevel.None);
加密
可以通过传递加密密钥来加密MMKV存储:
var mmkv = MMKV("test-encryption", cryptKey: 'MyEncryptKey');
可以随时更改加密密钥,甚至可以从加密切换为非加密:
mmkv.reKey("NewKey"); // 更改加密密钥
mmkv.reKey(null); // 切换为非加密
自定义位置
可以通过设置根目录来自定义MMKV的存储位置:
final dir = await getApplicationSupportDirectory();
final rootDir = await MMKV.initialize(rootDir: dir.path + '/mmkv_2');
print('MMKV for flutter with rootDir = $rootDir');
示例Demo
以下是一个完整的示例程序,展示了如何使用MMKV进行基本的CRUD操作:
import 'package:flutter/material.dart';
import 'package:mmkv/mmkv.dart';
import 'package:path_provider/path_provider.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
final appDir = await getApplicationSupportDirectory();
final rootDir = await MMKV.initialize(rootDir: appDir.path + '/mmkv');
print('MMKV for flutter with rootDir = $rootDir');
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('MMKV Demo')),
body: Center(
child: ElevatedButton(
onPressed: () {
functionalTest();
},
child: Text('Run Functional Test'),
),
),
),
);
}
void functionalTest() async {
final mmkv = MMKV.defaultMMKV();
mmkv.encodeBool('bool', true);
print('bool = ${mmkv.decodeBool('bool')}');
mmkv.encodeInt('int', 42);
print('int = ${mmkv.decodeInt('int')}');
mmkv.encodeString('string', 'Hello, MMKV!');
print('string = ${mmkv.decodeString('string')}');
mmkv.removeValue('bool');
print('contains "bool": ${mmkv.containsKey('bool')}');
}
}
以上是关于Flutter中使用MMKV的基本介绍和示例代码。更多详细信息可以参考MMKV官方文档。
更多关于Flutter高性能键值存储插件mmkv的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter高性能键值存储插件mmkv的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,MMKV(Memory Mapped Key-Value storage)是一个高性能的键值存储解决方案,特别适合用于需要频繁读写小数据的应用场景。下面是一个简单的示例,展示如何在Flutter项目中使用mmkv
插件。
1. 添加依赖
首先,在你的pubspec.yaml
文件中添加mmkv
依赖:
dependencies:
flutter:
sdk: flutter
mmkv: ^latest_version # 替换为最新的版本号
然后运行flutter pub get
来安装依赖。
2. 初始化MMKV
在Flutter中使用MMKV之前,需要先进行初始化。通常,你会在应用启动时进行这一操作。
import 'package:flutter/material.dart';
import 'package:mmkv/mmkv.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化MMKV
await MMKV.initialize();
runApp(MyApp());
}
3. 使用MMKV存储和读取数据
下面是一个简单的示例,展示如何使用MMKV存储和读取字符串数据:
import 'package:flutter/material.dart';
import 'package:mmkv/mmkv.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 初始化MMKV
await MMKV.initialize();
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('MMKV Demo'),
),
body: MMKVDemo(),
),
);
}
}
class MMKVDemo extends StatefulWidget {
@override
_MMKVDemoState createState() => _MMKVDemoState();
}
class _MMKVDemoState extends State<MMKVDemo> {
final String key = "demo_key";
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextField(
decoration: InputDecoration(
labelText: 'Enter some text',
),
onChanged: (value) async {
// 存储数据
await MMKV.defaultMMKV().putString(key, value);
},
),
SizedBox(height: 16),
ElevatedButton(
onPressed: () async {
// 读取数据
String value = await MMKV.defaultMMKV().getString(key, defaultValue: '');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text("Stored Value: $value")),
);
},
child: Text('Read Value'),
),
],
),
);
}
}
4. 运行应用
确保你的开发环境已经正确配置,然后运行你的Flutter应用。你应该能够看到一个简单的界面,允许你输入文本,并将其存储到MMKV中,然后点击按钮读取并显示存储的值。
注意事项
- MMKV的数据是持久化的,即使应用重启,之前存储的数据仍然可以读取。
- MMKV支持多种数据类型,包括字符串、整数、浮点数、布尔值以及自定义对象(通过序列化)。
- 对于大型数据集或复杂数据结构,请考虑使用其他存储方案,如SQLite或NoSQL数据库。
这个示例展示了如何在Flutter中使用MMKV进行基本的键值存储操作。根据你的具体需求,你可以进一步扩展和定制这个示例。