Flutter高性能键值存储插件mmkv的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter高性能键值存储插件mmkv的使用

MMKV是一个高效的、小型的、易于使用的移动键值存储框架,广泛应用于微信应用中。它目前支持Android和iOS平台。本文将介绍如何在Flutter项目中使用MMKV。

特性

  • 高效:MMKV使用mmap来保持内存与文件同步,并使用protobuf进行编码/解码,充分利用本地平台以实现最佳性能。
  • 易于使用:所有更改立即保存,无需调用syncapply
  • 小巧:仅包含必要的文件,二进制大小约为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-staticcom.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

1 回复

更多关于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进行基本的键值存储操作。根据你的具体需求,你可以进一步扩展和定制这个示例。

回到顶部