Flutter云端存储插件jingluo_icloud_storage的使用

Flutter云端存储插件jingluo_icloud_storage的使用

flutter 云端存储

pub package

效果图

用户默认值效果

开始使用

1. 项目配置

配置步骤

2. 使用

pubspec.yaml 文件中添加以下依赖:

dependencies:
  jingluo_icloud_storage: <latest_version>

导入插件:

import 'package:jingluo_icloud_storage/jingluo_icloud_storage.dart';

使用方式如下:

检查是否支持iCloud
var res = await JingluoIcloudStorage().isICloudEnabled();

返回结果如下:

// 成功
{msg: Success, code: 0}

// 失败
{msg: error, code: -1}
获取值

获取值时,如果拿不到key对应的value,则返回null。可以选择获取指定类型的value,获取不到则为null。

var res = await JingluoIcloudStorage().getValue(key: "localValue");

返回结果如下:

// 成功
{msg: 138, code: 0}

// 失败
{msg: error, code: -1}

可选值类型定义如下:

enum JingluoIcloudStorageType {
  string,
  array,
  dictionary,
  data,
  long,
  double,
  bool,
  none,
}
设置值
var res = await JingluoIcloudStorage().setValue(key: "count", value: 138);

返回结果如下:

// 成功
{msg: Success, code: 0}

// 失败
{msg: error, code: -1}
删除值
var res = await JingluoIcloudStorage().deleteValue(key: "localValue");

返回结果如下:

// 成功
{msg: Success, code: 0}

// 失败
{msg: error, code: -1}
监听值变化
JingluoIcloudStorage().registerEventListener(onEvent: (event) {
  if (event["key"] == JingluoIcloudStorageEventType.updateICloudStorage) {
    Map? map = event["payload"]["value"];
    if (map != null && map["count"] != null) {
      idx = map["count"];
    }
    setState(() {});
  }
});

返回结果如下:

// 成功
{payload: {code: 0, value: {count: 138}}, key: UPDATE_ICLOUD_STORAGE}

3. 常量

错误码 作用
0 成功
-1 参数错误
-2 iCloud未开启
事件Key 作用
UPDATE_ICLOUD_STORAGE UserDefaults刷新时触发

完整示例代码

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

import 'package:flutter/services.dart';
import 'package:jingluo_icloud_storage/jingluo_icloud_storage.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _platformVersion = 'Unknown';
  final _jingluoIcloudStoragePlugin = JingluoIcloudStorage();

  final _key = "count";

  var idx = 0;

  [@override](/user/override)
  void initState() {
    super.initState();
    startNotification();
    initPlatformState();
  }

  void startNotification() {
    _jingluoIcloudStoragePlugin.registerEventListener(onEvent: (event) {
      if (event["key"] == JingluoIcloudStorageEventType.updateICloudStorage) {
        Map? map = event["payload"]["value"];
        if (map != null && map[_key] != null) {
          idx = map[_key];
        }
        setState(() {});
      }
    });
  }

  // Platform messages are asynchronous, so we initialize in an async method.
  Future<void> initPlatformState() async {
    String platformVersion;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.

    var res = await _jingluoIcloudStoragePlugin.isICloudEnabled();
    if (res?['code'] != 0) {
      return;
    }
    try {
      platformVersion =
          await _jingluoIcloudStoragePlugin.getPlatformVersion() ??
              'Unknown platform version';

      var res = await _jingluoIcloudStoragePlugin.getValue(key: _key);
      setState(() {
        if (res != null && res['code'] == 0) {
          idx = int.parse((res["msg"] ?? 0).toString());
        }
      });
    } on PlatformException {
      platformVersion = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            children: [
              Text('Running on: $_platformVersion\n'),
              GestureDetector(
                onTap: () async {
                  var res = await _jingluoIcloudStoragePlugin.setValue(
                      key: "count", value: idx + 1);
                  if (res?['code'] == 0) {
                    setState(() {
                      idx++;
                    });
                  }
                },
                child: const Text("累加"),
              ),
              Text("当前的值:$idx")
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter云端存储插件jingluo_icloud_storage的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter云端存储插件jingluo_icloud_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


jingluo_icloud_storage 是一个用于在 Flutter 应用中访问和操作 iCloud 存储的插件。它允许你在 iOS 设备上将数据存储在 iCloud 中,并在应用的不同实例之间同步数据。

以下是如何使用 jingluo_icloud_storage 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 jingluo_icloud_storage 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  jingluo_icloud_storage: ^版本号

^版本号 替换为最新的插件版本。你可以通过 pub.dev 查找最新的版本号。

2. 配置 iCloud

在你的 iOS 项目中,确保你已经启用了 iCloud 功能:

  1. 打开 ios/Runner.xcworkspace
  2. 选择 Runner 项目。
  3. Signing & Capabilities 标签中,点击 + Capability 按钮。
  4. 添加 iCloud 功能,并确保勾选了 Key-value storageCloud Documents,具体取决于你需要的功能。

3. 使用 jingluo_icloud_storage 插件

在 Flutter 代码中,你可以使用 jingluo_icloud_storage 插件来存储和检索数据。

3.1 初始化

首先,初始化 jingluo_icloud_storage 插件:

import 'package:jingluo_icloud_storage/jingluo_icloud_storage.dart';

void initICloudStorage() async {
  await JingluoICloudStorage.initialize();
}

3.2 存储数据

你可以使用 setStringsetBoolsetInt 等方法来存储数据:

void saveData() async {
  await JingluoICloudStorage.setString('myKey', 'Hello, iCloud!');
  await JingluoICloudStorage.setBool('isLoggedIn', true);
  await JingluoICloudStorage.setInt('userAge', 30);
}

3.3 获取数据

你可以使用 getStringgetBoolgetInt 等方法来获取数据:

void getData() async {
  String myValue = await JingluoICloudStorage.getString('myKey');
  bool isLoggedIn = await JingluoICloudStorage.getBool('isLoggedIn');
  int userAge = await JingluoICloudStorage.getInt('userAge');

  print('myValue: $myValue');
  print('isLoggedIn: $isLoggedIn');
  print('userAge: $userAge');
}

3.4 删除数据

你可以使用 remove 方法来删除数据:

void removeData() async {
  await JingluoICloudStorage.remove('myKey');
}

4. 处理同步

由于 iCloud 数据是同步的,你需要注意数据同步的延迟。你可以监听 NSUbiquitousKeyValueStoreDidChangeExternallyNotification 通知来处理数据变更。

void listenForChanges() {
  JingluoICloudStorage.onChanged.listen((event) {
    print('iCloud data changed: $event');
    // 在这里处理数据变更
  });
}

5. 注意事项

  • iCloud 存储有一定的限制,例如每个应用的最大存储空间为 1MB。
  • 由于 iCloud 是跨设备同步的,确保你的应用在不同设备上处理数据时考虑到了同步延迟。

6. 示例代码

以下是一个完整的示例代码,展示了如何使用 jingluo_icloud_storage 插件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await JingluoICloudStorage.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('iCloud Storage Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: Center,
            children: [
              ElevatedButton(
                onPressed: () async {
                  await JingluoICloudStorage.setString('myKey', 'Hello, iCloud!');
                  print('Data saved to iCloud');
                },
                child: Text('Save Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  String value = await JingluoICloudStorage.getString('myKey');
                  print('Data from iCloud: $value');
                },
                child: Text('Get Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  await JingluoICloudStorage.remove('myKey');
                  print('Data removed from iCloud');
                },
                child: Text('Remove Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部