Flutter数据同步界面插件at_sync_ui_flutter的使用

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

Flutter数据同步界面插件 at_sync_ui_flutter 的使用

概述

at_sync_ui_flutter 是一个用于Flutter开发者的插件,旨在实现数据同步过程的UI指示器。该开源包由Dart编写,支持Flutter,并遵循去中心化、边缘计算模型,具有以下特性:

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

快速开始

有三种方法可以开始使用这个包。

1. 使用 at_app 快速生成骨架应用

$ flutter pub global activate at_app 
$ at_app create --sample=<package ID> <app name> 
$ cd <app name>
$ flutter run

注意:

  1. 你只需要运行 flutter pub global activate 一次。
  2. 在Windows上使用 at_app.bat

2. 从GitHub克隆

你可以从 GitHub仓库 克隆源代码。

$ git clone https://github.com/atsign-foundation/at_widgets.git

3. 手动添加包到项目中

详细的手动添加步骤可以在 pub.dev 上找到。

如何工作

初始化

在初始化时,通常首先使用Onboarding小部件对atsign进行身份验证。

AtSyncUIService().init(
    appNavigator: navKey,
    style: _atSyncUIStyle,
    onSuccessCallback: _onSuccessCallback,
    onErrorCallback: _onErrorCallback,
);

可以选择:

  • UI样式:Material或Cupertino
  • 同步期间显示的覆盖类型:Dialog或Snackbar
  • 成功和失败的回调函数
  • 主要颜色、背景色、标签颜色等

使用示例

调用同步并显示选定的UI:

AtSyncUIService().sync(
    atSyncUIOverlay: AtSyncUIOverlay.snackbar,
);

监听同步状态变化:

AtSyncUIService().atSyncUIListener;

插件描述

该插件提供以下组件:

  • AtSyncButton
  • AtSyncIndicator
  • AtSyncLinearProgressIndicator
  • AtSyncText
  • AtSyncDialog
  • AtSyncSnackBar

组件使用示例

AtSyncButton

AtSyncButton(
    isLoading: isLoading,
    syncIndicatorColor: Colors.white,
    child: IconButton(
        icon: const Icon(Icons.android),
        onPressed: () {},
    ),
)

AtSyncIndicator

AtSyncIndicator(
    value: progress,
    color: _indicatorColor,
)

AtSyncLinearProgressIndicator

AtSyncLinearProgressIndicator(
    value: progress,
    color: _indicatorColor,
)

AtSyncText

AtSyncText(
    value: progress,
    child: const Text('completed'),
    indicatorColor: _indicatorColor,
)

AtSyncDialog

final dialog = material.AtSyncDialog(context: context);
dialog.show(message: 'Downloading ...');
dialog.update(value: _value, message: 'Downloading ...');
dialog.close();

AtSyncSnackBar

final snackBar = material.AtSyncSnackBar(context: context);
snackBar.show(message: 'Downloading ...');
snackBar.update(value: _value, message: 'Downloading ...');
snackBar.dismiss();

完整示例

下面是一个完整的示例应用,展示了如何集成和使用 at_sync_ui_flutter 包。

import 'dart:async';
import 'package:at_app_flutter/at_app_flutter.dart' show AtEnv;
import 'package:at_client_mobile/at_client_mobile.dart';
import 'package:at_onboarding_flutter/at_onboarding_flutter.dart'
    show AtOnboarding, AtOnboardingConfig, AtOnboardingResultStatus;
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart' show getApplicationSupportDirectory';

Future<void> main() async {
  await AtEnv.load();
  runApp(const MyApp());
}

Future<AtClientPreference> loadAtClientPreference() async {
  var dir = await getApplicationSupportDirectory();
  return AtClientPreference()
    ..rootDomain = AtEnv.rootDomain
    ..namespace = AtEnv.appNamespace
    ..hiveStoragePath = dir.path
    ..commitLogPath = dir.path
    ..isLocalStoreRequired = true;
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  Future<AtClientPreference> futurePreference = loadAtClientPreference();
  AtClientPreference? atClientPreference;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: NavService.navKey,
      theme: ThemeData().copyWith(
        brightness: Brightness.light,
        primaryColor: const Color(0xFFf4533d),
        colorScheme: ThemeData.light().colorScheme.copyWith(
              primary: const Color(0xFFf4533d),
              surface: Colors.white,
            ),
        scaffoldBackgroundColor: Colors.white,
      ),
      darkTheme: ThemeData().copyWith(
        brightness: Brightness.dark,
        primaryColor: Colors.blue,
        colorScheme: ThemeData.dark().colorScheme.copyWith(
              primary: Colors.blue,
              surface: Colors.grey[850],
            ),
        scaffoldBackgroundColor: Colors.grey[850],
      ),
      home: Scaffold(
        appBar: AppBar(
          title: const Text('At Sync UI flutter example'),
          actions: <Widget>[
            IconButton(
              onPressed: () {
                // Toggle theme mode logic here
              },
              icon: Icon(
                Theme.of(context).brightness == Brightness.light
                    ? Icons.dark_mode_outlined
                    : Icons.light_mode_outlined,
              ),
            )
          ],
        ),
        body: Builder(
          builder: (context) => Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                ElevatedButton(
                  onPressed: () async {
                    var preference = await futurePreference;
                    setState(() {
                      atClientPreference = preference;
                    });
                    if (context.mounted) {
                      final result = await AtOnboarding.onboard(
                        context: context,
                        config: AtOnboardingConfig(
                          atClientPreference: atClientPreference!,
                          domain: AtEnv.rootDomain,
                          rootEnvironment: AtEnv.rootEnvironment,
                          appAPIKey: AtEnv.appApiKey,
                        ),
                      );
                      switch (result.status) {
                        case AtOnboardingResultStatus.success:
                          // Navigate to next screen on success
                          break;
                        case AtOnboardingResultStatus.error:
                          ScaffoldMessenger.of(context).showSnackBar(
                            const SnackBar(
                              backgroundColor: Colors.red,
                              content: Text('An error has occurred'),
                            ),
                          );
                          break;
                        case AtOnboardingResultStatus.cancel:
                          break;
                      }
                    }
                  },
                  child: const Text('Onboard an atSign'),
                ),
                const SizedBox(height: 10),
                ElevatedButton(
                  onPressed: () async {
                    var preference = await futurePreference;
                    atClientPreference = preference;
                    if (context.mounted) {
                      await AtOnboarding.reset(
                        context: context,
                        config: AtOnboardingConfig(
                          atClientPreference: atClientPreference!,
                          domain: AtEnv.rootDomain,
                          rootEnvironment: AtEnv.rootEnvironment,
                          appAPIKey: AtEnv.appApiKey,
                        ),
                      );
                    }
                  },
                  child: const Text('Reset'),
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

class NavService {
  static GlobalKey<NavigatorState> navKey = GlobalKey();
}

更多关于Flutter数据同步界面插件at_sync_ui_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据同步界面插件at_sync_ui_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成和使用at_sync_ui_flutter插件来进行数据同步界面的示例代码。这个插件可能是一个假想的或者基于某个实际插件的简化版本,因为具体的实现细节会依赖于实际的插件API。不过,以下代码提供了一个通用的集成步骤和示例。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  at_sync_ui_flutter: ^x.y.z  # 替换为实际的版本号

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

2. 导入插件

在你的Dart文件中导入插件。

import 'package:at_sync_ui_flutter/at_sync_ui_flutter.dart';

3. 配置和使用

以下是一个基本的示例,展示了如何配置和使用at_sync_ui_flutter插件来显示数据同步界面。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Data Sync UI Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: SyncScreen(),
    );
  }
}

class SyncScreen extends StatefulWidget {
  @override
  _SyncScreenState createState() => _SyncScreenState();
}

class _SyncScreenState extends State<SyncScreen> {
  // 模拟同步状态
  bool isSyncing = false;
  String syncStatus = "Not Syncing";

  // 模拟同步函数
  void startSync() async {
    setState(() {
      isSyncing = true;
      syncStatus = "Syncing...";
    });

    // 模拟同步过程(使用延迟模拟)
    await Future.delayed(Duration(seconds: 5));

    setState(() {
      isSyncing = false;
      syncStatus = "Sync Complete";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Data Sync UI Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              syncStatus,
              style: TextStyle(fontSize: 20),
            ),
            SizedBox(height: 20),
            if (isSyncing) {
              // 显示同步中的UI
              AtSyncProgressIndicator(
                message: "Synchronizing your data...",
              )
            } else {
              // 显示同步按钮
              ElevatedButton(
                onPressed: startSync,
                child: Text('Start Sync'),
              ),
            },
          ],
        ),
      ),
    );
  }
}

// 假设AtSyncProgressIndicator是插件提供的一个组件
// 你可以根据插件的实际API来调整这个组件的使用方式
class AtSyncProgressIndicator extends StatelessWidget {
  final String message;

  AtSyncProgressIndicator({required this.message});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          CircularProgressIndicator(),
          SizedBox(height: 10),
          Text(message),
        ],
      ),
    );
  }
}

注意事项

  1. 插件API:上述代码中的AtSyncProgressIndicator是一个假设的组件,实际使用时,你应该参考at_sync_ui_flutter插件的官方文档来找到正确的组件和API。
  2. 状态管理:在真实的应用中,你可能会使用更复杂的状态管理方案(如Bloc、Provider或Riverpod)来处理同步状态。
  3. 错误处理:示例代码中没有包含错误处理逻辑。在实际应用中,你应该添加适当的错误处理来增强应用的健壮性。

希望这个示例能够帮助你快速上手at_sync_ui_flutter插件的使用。如果你有更具体的需求或问题,请查阅插件的官方文档或提出更详细的问题。

回到顶部