Flutter分布式数据存储插件at_client的使用

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

Flutter分布式数据存储插件at_client的使用

简介

at_client 是一个用于构建基于 atProtocol 的应用程序的非平台特定客户端 SDK。它提供了基本的方法来实现去中心化、边缘计算模型,具有以下特性:

  • 通过个人数据存储进行加密控制数据访问
  • 不需要应用后端
  • 端到端加密,只有数据所有者拥有密钥
  • 私有且无监视的连接

我们称之为“翻转互联网”,即给人们控制其数据访问的权利。

开始使用

在第一次使用此包之前,您应该遵循 getting started guide。您可能还需要阅读 atPlatform 概述

该包可在 pub.dev 上找到:https://pub.dev/packages/at_client

使用示例

设置 AtClientPreferences

首先,设置您的偏好设置:

import 'package:path_provider/path_provider.dart';
import 'package:at_client/at_client.dart';

Future<void> setupPreferences() async {
  Directory appSupportDir = await getApplicationSupportDirectory();
  AtClientPreference preferences = AtClientPreference()
    ..rootDomain = 'root.atsign.org'
    ..namespace = '.my_namespace'
    ..hiveStoragePath = appSupportDir.path
    ..commitLogPath = appSupportDir.path
    ..isLocalStoreRequired = true;

  // 初始化当前用户
  AtClientManager atClientManagerInstance = await AtClientManager.getInstance().setCurrentAtSign('@yourAtsign', 'appNamespace', preferences);
}

更新用户数据

使用 put() 方法更新数据:

Future<void> updateData(AtClient atClientInstance) async {
  AtKey atKey = AtKey()
    ..key = 'phone'
    ..namespace = '.myApp';
  
  await atClientInstance.put(atKey, '+00 123-456-7890');
}

获取数据

使用 get() 方法获取数据:

Future<void> getData(AtClient atClientInstance) async {
  AtKey atKey = AtKey()
    ..key = 'phone'
    ..namespace = '.myApp';
  
  AtValue value = await atClientInstance.get(atKey);
  print(value.value); // 输出: +00 123-456-7890
}

删除数据

使用 delete() 方法删除数据:

Future<void> deleteData(AtClient atClientInstance) async {
  AtKey atKey = AtKey()
    ..key = 'phone'
    ..namespace = '.myApp';
  
  bool isDeleted = await atClientInstance.delete(atKey);
  print(isDeleted); // 如果删除成功,输出: true
}

同步数据

如果需要,可以使用 sync() 方法同步数据:

SyncService _syncService;

void syncData(AtClientManager atClientManagerInstance) {
  _syncService = atClientManagerInstance.syncService;
  _syncService.sync();
}

发送通知

使用 notify() 方法发送通知:

Future<void> notifyUpdate(AtClient atClientInstance) async {
  MetaData metaData = MetaData()
    ..ttl = '60000'
    ..ttb = '30000';

  AtKey key = AtKey()
    ..key = 'phone'
    ..sharedWith = '@bob'
    ..metadata = metaData
    ..namespace = '.myApp';

  String value = (await atClientInstance.get(key)).value;
  OperationEnum operation = OperationEnum.update;

  bool isNotified = await atClientInstance.notify(key, value, operation);
  print(isNotified); // 如果通知成功,输出: true
}

监听连接状态

使用 ConnectivityListener 监听连接状态:

void checkConnection() {
  ConnectivityListener().subscribe().listen((isConnected) {
    if (isConnected) {
      print('connection available');
    } else {
      print('connection lost');
    }
  });
}

完整示例

以下是一个完整的示例,展示如何使用 at_client 插件:

import 'package:at_client/at_client.dart';
import 'package:at_client/src/util/encryption_util.dart';
import 'package:path_provider/path_provider.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  Directory appSupportDir = await getApplicationSupportDirectory();
  AtClientPreference preferences = AtClientPreference()
    ..rootDomain = 'root.atsign.org'
    ..namespace = '.myApp'
    ..hiveStoragePath = appSupportDir.path
    ..commitLogPath = appSupportDir.path
    ..isLocalStoreRequired = true;

  AtClientManager atClientManagerInstance = await AtClientManager.getInstance().setCurrentAtSign('@yourAtsign', 'myApp', preferences);

  runApp(MyApp(atClientManagerInstance));
}

class MyApp extends StatelessWidget {
  final AtClientManager atClientManagerInstance;

  MyApp(this.atClientManagerInstance);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('at_client Example')),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  AtKey atKey = AtKey()
                    ..key = 'phone'
                    ..namespace = '.myApp';
                  
                  await atClientManagerInstance.atClient.put(atKey, '+00 123-456-7890');
                  print('Data updated');
                },
                child: Text('Update Data'),
              ),
              ElevatedButton(
                onPressed: () async {
                  AtKey atKey = AtKey()
                    ..key = 'phone'
                    ..namespace = '.myApp';
                  
                  AtValue value = await atClientManagerInstance.atClient.get(atKey);
                  print('Phone number: ${value.value}');
                },
                child: Text('Get Data'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

请参考 at_sign docs 获取更多详细信息。


更多关于Flutter分布式数据存储插件at_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter分布式数据存储插件at_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,使用at_client插件来实现分布式数据存储是一项高级功能。at_client是AtSign生态的一部分,专为去中心化应用设计。以下是一个简单的代码示例,展示如何在Flutter应用中集成和使用at_client进行分布式数据存储。

首先,确保你已经在pubspec.yaml文件中添加了at_client_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  at_client_sdk: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们需要在Flutter应用中初始化AtClient并进行一些基本的存储和检索操作。以下是一个示例代码:

import 'package:flutter/material.dart';
import 'package:at_client_sdk/at_client_sdk.dart';
import 'package:at_commons/at_commons.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  AtClient? _atClient;

  @override
  void initState() {
    super.initState();
    initializeAtClient();
  }

  Future<void> initializeAtClient() async {
    // 配置AtClientManager
    var atClientManager = AtClientManager(
      rootDomain: 'root.atsign.dev', // 替换为你的根域名
      namespace: 'my_app',           // 命名空间
      commitLogPath: './commit_log',  // 本地日志存储路径
      preferOnline: true,             // 是否优先在线
    );

    // 初始化AtClient
    _atClient = await atClientManager.getAtClient();

    // 等待初始化完成后,可以执行存储操作
    if (_atClient != null) {
      setState(() {}); // 更新UI,如果需要的话
      storeData();
    }
  }

  Future<void> storeData() async {
    if (_atClient != null) {
      var key = 'name';
      var value = 'Flutter Developer';
      var metadata = Metadata()..ttl = 3600; // 设置TTL为3600秒

      try {
        await _atClient!.put(key, value, metadata: metadata);
        print('Data stored successfully');
      } catch (e) {
        print('Error storing data: $e');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AtClient Example'),
        ),
        body: Center(
          child: Text(
            'Data storage initialized. Check console for details.',
            style: TextStyle(fontSize: 20),
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 配置和初始化AtClientManager:设置根域名、命名空间、本地日志存储路径以及是否优先在线等参数。
  2. 获取AtClient实例:通过AtClientManager获取AtClient实例。
  3. 存储数据:使用AtClientput方法存储键值对数据,并设置元数据(如TTL)。

请注意,此示例仅展示了基本的初始化和数据存储操作。在实际应用中,你可能需要处理更多的错误情况、配置网络请求、管理用户认证等。

此外,确保你的应用已经正确配置了必要的网络权限,并且你的AtSign已经正确注册和配置在AtSign生态中。对于更详细的使用指南和高级功能,请参考at_client_sdk的官方文档。

回到顶部