Flutter数据同步界面插件at_sync_ui_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
注意:
- 你只需要运行
flutter pub global activate
一次。 - 在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
更多关于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),
],
),
);
}
}
注意事项
- 插件API:上述代码中的
AtSyncProgressIndicator
是一个假设的组件,实际使用时,你应该参考at_sync_ui_flutter
插件的官方文档来找到正确的组件和API。 - 状态管理:在真实的应用中,你可能会使用更复杂的状态管理方案(如Bloc、Provider或Riverpod)来处理同步状态。
- 错误处理:示例代码中没有包含错误处理逻辑。在实际应用中,你应该添加适当的错误处理来增强应用的健壮性。
希望这个示例能够帮助你快速上手at_sync_ui_flutter
插件的使用。如果你有更具体的需求或问题,请查阅插件的官方文档或提出更详细的问题。