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

mmkv_ios #

这是 MMKV 的 iOS 实现细节。

使用 #

切勿单独使用。它不是完整的 MMKV 功能集。它只是提供 MMKV 所需的 FFI 实现。

此包是 官方推荐的插件,这意味着您可以直接使用 mmkv。 当您这样做时,此包将自动包含在您的应用中,因此您无需将其添加到您的 pubspec.yaml 中。

但是,如果您导入此包以直接使用其任何 API,则应像往常一样将其添加到您的 pubspec.yaml 中。

示例 #

以下是一个完整的示例演示如何使用 Flutter 高性能键值存储插件 mmkv_ios。

设置 #

首先,在您的 pubspec.yaml 文件中添加 mmkv 依赖:

dependencies:
  mmkv: ^0.1.0

初始化 #

在您的应用中初始化 MMKV:

import 'package:mmkv/mmkv.dart';

void main() { // 初始化 MMKV Mmkv.init(); runApp(MyApp()); }

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } }

写入数据 #

将数据写入 MMKV:

import 'package:mmkv/mmkv.dart';

void writeData() async { // 写入字符串 await Mmkv.setString(‘name’, ‘John Doe’);

// 写入整数 await Mmkv.setInt(‘age’, 25);

// 写入布尔值 await Mmkv.setBool(‘isStudent’, true); }

读取数据 #

从 MMKV 读取数据:

import 'package:mmkv/mmkv.dart';

void readData() async { // 读取字符串 String name = await Mmkv.getString(‘name’) ?? ‘Unknown’; print(‘Name: $name’);

// 读取整数 int age = await Mmkv.getInt(‘age’) ?? 0; print(‘Age: $age’);

// 读取布尔值 bool isStudent = await Mmkv.getBool(‘isStudent’) ?? false; print(‘Is Student: $isStudent’); }

删除数据 #

从 MMKV 删除数据:

import 'package:mmkv/mmkv.dart';

void deleteData() async { // 删除特定键的值 await Mmkv.remove(‘name’);

// 清除所有数据 await Mmkv.clear(); }

完整示例 #

以下是完整的示例代码,展示了如何初始化 MMKV 并进行读写操作:

import 'package:flutter/material.dart';
import 'package:mmkv/mmkv.dart';

void main() { // 初始化 MMKV Mmkv.init(); runApp(MyApp()); }

class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: HomePage(), ); } }

class HomePage extends StatefulWidget { @override _HomePageState createState() => _HomePageState(); }

class _HomePageState extends State<HomePage> { final TextEditingController _nameController = TextEditingController(); final TextEditingController _ageController = TextEditingController(); final TextEditingController _studentController = TextEditingController();

@override void dispose() { _nameController.dispose(); _ageController.dispose(); _studentController.dispose(); super.dispose(); }

void _writeData() async { String name = _nameController.text; int age = int.parse(_ageController.text); bool isStudent = _studentController.text.toLowerCase() == ‘true’;

await Mmkv.setString('name', name);
await Mmkv.setInt('age', age);
await Mmkv.setBool('isStudent', isStudent);

ScaffoldMessenger.of(context).showSnackBar(
  SnackBar(content: Text('Data written successfully')),
);

}

void _readData() async { String name = await Mmkv.getString(‘name’) ?? ‘Unknown’; int age = await Mmkv.getInt(‘age’) ?? 0; bool isStudent = await Mmkv.getBool(‘isStudent’) ?? false;

setState(() {
  _nameController.text = name;
  _ageController.text = age.toString();
  _studentController.text = isStudent.toString();
});

}

void _deleteData() async { await Mmkv.remove(‘name’); await Mmkv.clear();

ScaffoldMessenger.of(context).showSnackBar(
  SnackBar(content: Text('Data deleted successfully')),
);

}

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text(‘MMKV Example’)), body: Padding( padding: const EdgeInsets.all(16.0), child: Column( children: [ TextField(controller: _nameController, decoration: InputDecoration(labelText: ‘Name’)), TextField(controller: _ageController, decoration: InputDecoration(labelText: ‘Age’)), TextField(controller: _studentController, decoration: InputDecoration(labelText: ‘Is Student (true/false)’)), SizedBox(height: 20), ElevatedButton(onPressed: _writeData, child: Text(‘Write Data’)), ElevatedButton(onPressed: _readData, child: Text(‘Read Data’)), ElevatedButton(onPressed: _deleteData, child: Text(‘Delete Data’)), ], ), ), ); } }


更多关于Flutter高性能键值存储插件mmkv_ios的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高性能键值存储插件mmkv_ios的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用高性能键值存储插件mmkv_ios的代码示例。请注意,mmkv_ios主要用于iOS平台,而Flutter的跨平台项目通常会使用一个同时支持Android和iOS的插件,如mmkv_flutter。不过,这里为了符合你的要求,我们将专注于mmkv_ios在iOS平台上的使用。

首先,确保你的Flutter项目已经创建,并且你已经在ios/目录下打开了Xcode项目。

1. 添加依赖

由于mmkv_ios是一个iOS原生插件,你需要在Xcode中直接添加它,而不是在pubspec.yaml中。打开Xcode,然后按照以下步骤操作:

  • 选择你的项目目标(在Xcode的左侧项目导航栏中)。
  • 转到“General”标签页。
  • 向下滚动到“Frameworks, Libraries, and Embedded Content”部分。
  • 点击“+”按钮,添加MMKV.framework(你可能需要先下载或构建这个框架)。

2. 配置桥接

为了从Flutter代码中调用iOS原生代码,你需要创建一个MethodChannel。虽然mmkv_ios本身不提供Flutter插件封装,但你可以自己封装一个。以下是如何在Flutter和iOS之间建立通信的示例。

Flutter端代码

lib/目录下创建一个新的Dart文件,比如mmkv_service.dart

import 'package:flutter/services.dart';

class MMKVService {
  static const MethodChannel _channel = MethodChannel('com.example.mmkv_service');

  static Future<void> saveValue(String key, String value) async {
    try {
      await _channel.invokeMethod('saveValue', <String, String>{
        'key': key,
        'value': value,
      });
    } on PlatformException catch (e) {
      print("Failed to save value: '${e.message}'.");
    }
  }

  static Future<String?> getValue(String key) async {
    try {
      final Map<String, dynamic> result = await _channel.invokeMapMethod('getValue', <String, String>{
        'key': key,
      });
      return result['value'] as String?;
    } on PlatformException catch (e) {
      print("Failed to get value: '${e.message}'.");
      return null;
    }
  }
}

iOS端代码

在Xcode中,打开AppDelegate.swift(或你用于处理Flutter平台通道的文件),并添加以下代码:

import UIKit
import Flutter
import MMKV  // 确保你已经导入了MMKV框架

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    
    // 初始化MMKV(这里假设你有一个默认的MMKV实例)
    MMKV.default().initialize()
    
    // 注册MethodChannel
    let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
    let channel = FlutterMethodChannel(name: "com.example.mmkv_service", binaryMessenger: controller.binaryMessenger)
    channel.setMethodCallHandler({
      (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
      
      if call.method == "saveValue" {
        guard let arguments = call.arguments as? [String: String],
              let key = arguments["key"],
              let value = arguments["value"] else {
          result(FlutterError(code: "INVALID_ARGUMENT", message: "Invalid argument passed", details: nil))
          return
        }
        
        MMKV.default().setString(value, forKey: key)
        result(nil)
      } else if call.method == "getValue" {
        guard let arguments = call.arguments as? [String: String],
              let key = arguments["key"] else {
          result(FlutterError(code: "INVALID_ARGUMENT", message: "Invalid argument passed", details: nil))
          return
        }
        
        if let value = MMKV.default().string(forKey: key) {
          result(["value": value])
        } else {
          result(["value": nil])
        }
      } else {
        result(FlutterMethodNotImplementedError(methodName: call.method))
      }
    })
    
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}

3. 使用服务

现在,你可以在你的Flutter应用中使用MMKVService来存储和检索键值对:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('MMKV Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  await MMKVService.saveValue('testKey', 'testValue');
                  print('Value saved');
                },
                child: Text('Save Value'),
              ),
              ElevatedButton(
                onPressed: () async {
                  final String? value = await MMKVService.getValue('testKey');
                  print('Retrieved Value: $value');
                },
                child: Text('Retrieve Value'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中通过MethodChannel与iOS原生的MMKV进行交互。请注意,mmkv_ios本身可能不包含Flutter插件支持,因此上述代码是一种手动封装的方法。对于生产环境,建议使用官方或社区维护的跨平台插件,如mmkv_flutter,以确保更好的兼容性和维护性。

回到顶部