Flutter后端服务集成插件carp_backend的使用

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

Flutter后端服务集成插件carp_backend的使用

1. 简介

carp_backend 插件用于将 CARP Mobile Sensing 框架与 CARP Web Services (CAWS) 后端进行集成。通过该插件,您可以实现以下功能:

  • 下载研究邀请
  • 下载研究部署
  • 上传收集的数据
  • 获取和上传知情同意书
  • 获取和上传翻译
  • 获取和上传消息

2. 使用插件

2.1 添加依赖

首先,在 pubspec.yaml 文件中添加 carp_backend 作为依赖项,并导入所需的库:

dependencies:
  flutter:
    sdk: flutter
  carp_core: ^latest_version
  carp_mobile_sensing: ^latest_version
  carp_webservices: ^latest_version
  carp_backend: ^latest_version

然后在 Dart 文件中导入这些库:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_webservices/carp_auth/carp_auth.dart';
import 'package:carp_webservices/carp_services/carp_services.dart';
import 'package:carp_backend/carp_backend.dart';
2.2 配置 CAWS 应用

为了访问 CAWS,您需要配置一个 CarpApp 对象,并设置认证信息。以下是一个示例配置:

// 配置指向 CAWS 的应用
final Uri uri = Uri(
  scheme: 'https',
  host: 'dev.carp.dk',
);

late CarpApp app = CarpApp(
  name: "CAWS @ DTU",
  uri: uri,
  studyId: '<the_study_id_if_known>',
  studyDeploymentId: '<the_study_deployment_id_if_known>',
);

// 认证配置
late CarpAuthProperties authProperties = CarpAuthProperties(
  authURL: uri,
  clientId: 'studies-app',
  redirectURI: Uri.parse('carp-studies-auth://auth'),
  discoveryURL: uri.replace(pathSegments: ['auth', 'realms', 'Carp']),
);

// 配置 CAWS 服务
await CarpAuthService().configure(authProperties);
CarpService().configure(app);

// 使用用户名和密码进行认证
await CarpAuthService().authenticateWithUsernamePassword(
  username: 'the_username',
  password: 'the_password',
);

// 配置其他所需的服务
CarpParticipationService().configureFrom(CarpService());
CarpDeploymentService().configureFrom(CarpService());
2.3 下载研究邀请和部署

通过 CarpParticipationServiceCarpDeploymentService 服务,您可以从 CAWS 获取研究邀请和部署信息。以下是一个示例代码:

// 获取用户的研究邀请
List<ActiveParticipationInvitation> invitations =
    await CarpParticipationService().getActiveParticipationInvitations();

// 使用第一个(即最新的)邀请
final invitation = invitations[0];

// 创建并配置客户端管理器
final client = SmartPhoneClientManager();
await client.configure();

// 根据邀请定义研究并添加到客户端
final study = SmartphoneStudy.fromInvitation(invitation);
await client.addStudy(study);

// 获取研究控制器并尝试部署研究
final controller = client.getStudyRuntime(study.studyDeploymentId);
await controller?.tryDeployment(useCached: false);

// 配置控制器
await controller?.configure();

// 开始采样
controller?.start();
2.4 数据上传

数据上传可以通过三种方式进行:流式上传、数据点上传和文件上传。以下是每种方式的示例配置:

2.4.1 流式上传

流式上传是默认的上传方式,适用于大多数场景。它要求研究部署已从 CAWS 获取。

// 使用流式上传方法
var streamingEndPoint = CarpDataEndPoint(
  uploadInterval: 20, // 上传间隔(分钟)
  onlyUploadOnWiFi: true, // 仅在连接 WiFi 时上传
  deleteWhenUploaded: false, // 上传后是否删除本地缓存
);
2.4.2 数据点上传

数据点上传是一种旧的方式,适用于需要上传批量数据点的场景。

// 使用数据点上传方法
var dataPointEndPoint = CarpDataEndPoint(uploadMethod: CarpUploadMethod.datapoint);
2.4.3 文件上传

文件上传适用于上传原始 SQLite 数据库文件。

// 使用文件上传方法
var fileEndPoint = CarpDataEndPoint(uploadMethod: CarpUploadMethod.file);
2.5 将数据端点添加到研究协议

将数据端点添加到研究协议中,以便在研究中使用。

// 创建一个包含特定数据端点的研究协议
SmartphoneStudyProtocol protocol = SmartphoneStudyProtocol(
  ownerId: 'AB',
  name: 'Track patient movement',
  dataEndPoint: streamingEndPoint,
);
2.6 注册数据管理器

为了使用 CAWS 数据管理器进行数据上传,您需要注册其工厂类。

// 注册 CAWS 数据管理器工厂
DataManagerRegistry().register(CarpDataManagerFactory());

3. 完整示例 Demo

以下是一个完整的示例代码,展示了如何使用 carp_backend 插件与 CAWS 进行集成:

import 'package:carp_core/carp_core.dart';
import 'package:carp_mobile_sensing/carp_mobile_sensing.dart';
import 'package:carp_webservices/carp_auth/carp_auth.dart';
import 'package:carp_webservices/carp_services/carp_services.dart';
import 'package:carp_backend/carp_backend.dart';
import 'package:research_package/model.dart';

void main() async {
  // -----------------------------------------------
  // CONFIGURING THE CAWS APP
  // -----------------------------------------------

  // 配置指向 CAWS 的应用
  final Uri uri = Uri(
    scheme: 'https',
    host: 'dev.carp.dk',
  );

  late CarpApp app = CarpApp(
    name: "CAWS @ DTU",
    uri: uri,
  );

  // 认证配置
  late CarpAuthProperties authProperties = CarpAuthProperties(
    authURL: uri,
    clientId: 'studies-app',
    redirectURI: Uri.parse('carp-studies-auth://auth'),
    discoveryURL: uri.replace(pathSegments: ['auth', 'realms', 'Carp']),
  );

  // 配置 CAWS 服务
  await CarpAuthService().configure(authProperties);
  CarpService().configure(app);

  // 使用用户名和密码进行认证
  await CarpAuthService().authenticateWithUsernamePassword(
    username: 'the_username',
    password: 'the_password',
  );

  // 配置其他所需的服务
  CarpParticipationService().configureFrom(CarpService());
  CarpDeploymentService().configureFrom(CarpService());

  // -----------------------------------------------
  // GETTING INVITATIONS FROM CAWS
  // -----------------------------------------------

  // 获取用户的研究邀请
  List<ActiveParticipationInvitation> invitations =
      await CarpParticipationService().getActiveParticipationInvitations();

  // 使用第一个(即最新的)邀请
  final invitation = invitations[0];

  // ------------------------------------------------------------
  // CONFIGURING A CLIENT TO GET STUDY DEPLOYMENTS FROM CAWS
  // ------------------------------------------------------------

  // 创建并配置客户端管理器
  final client = SmartPhoneClientManager();
  await client.configure();

  // 根据邀请定义研究并添加到客户端
  final study = SmartphoneStudy.fromInvitation(invitation);
  await client.addStudy(study);

  // 获取研究控制器并尝试部署研究
  final controller = client.getStudyRuntime(study.studyDeploymentId);
  await controller?.tryDeployment(useCached: false);

  // 配置控制器
  await controller?.configure();

  // 开始采样
  controller?.start();

  // -----------------------------------------------
  // DIFFERENT WAYS TO UPLOAD DATA TO CAWS
  // -----------------------------------------------

  // 注册 CAWS 数据管理器工厂
  DataManagerRegistry().register(CarpDataManagerFactory());

  // 使用流式上传方法
  var streamingEndPoint = CarpDataEndPoint(
    uploadInterval: 20, // 上传间隔(分钟)
    onlyUploadOnWiFi: true, // 仅在连接 WiFi 时上传
    deleteWhenUploaded: false, // 上传后是否删除本地缓存
  );

  // 使用数据点上传方法
  var dataPointEndPoint = CarpDataEndPoint(uploadMethod: CarpUploadMethod.datapoint);

  // 使用文件上传方法
  var fileEndPoint = CarpDataEndPoint(uploadMethod: CarpUploadMethod.file);

  // 创建一个包含特定数据端点的研究协议
  SmartphoneStudyProtocol protocol = SmartphoneStudyProtocol(
    ownerId: 'AB',
    name: 'Track patient movement',
    dataEndPoint: streamingEndPoint,
  );

  // --------------------------------------------------
  // HANDLING INFORMED CONSENT FROM CARP
  // --------------------------------------------------

  // 创建并初始化知情同意管理器
  CarpResourceManager icManager = CarpResourceManager();
  icManager.initialize();

  // 创建一个简单的知情同意
  final consent = RPOrderedTask(identifier: '12', steps: [
    RPInstructionStep(
      identifier: "1",
      title: "Welcome!",
    )..text = "Welcome to this study! ",
    RPCompletionStep(
        identifier: "2",
        title: "Thank You!",
        text: "We saved your consent document."),
  ]);

  // 上传知情同意到 CAWS
  await icManager.setInformedConsent(consent);

  // 获取知情同意
  RPOrderedTask? myConsent = await icManager.getInformedConsent();
}

更多关于Flutter后端服务集成插件carp_backend的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter后端服务集成插件carp_backend的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,作为IT专家,我可以为你提供一个关于如何在Flutter项目中集成并使用carp_backend插件的代码案例。请注意,这个示例假设carp_backend是一个已经存在的Flutter插件,用于与后端服务进行交互。实际使用时,你可能需要根据插件的官方文档进行微调。

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

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用carp_backend插件来与后端服务进行交互。

1. 初始化插件

在你的main.dart或相应的初始化文件中,初始化carp_backend插件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 初始化CarpBackend
    CarpBackend.initialize();
    
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

2. 配置后端服务的URL和认证信息

在实际使用中,你可能需要在初始化时配置后端服务的URL和认证信息(如API密钥、用户名和密码等)。这通常可以在插件的初始化方法中进行配置。假设carp_backend提供了一个configure方法:

CarpBackend.configure(
  baseUrl: 'https://your-backend-api.com/api',
  apiKey: 'your-api-key',
);

3. 调用后端服务

假设carp_backend插件提供了一个fetchData方法来从后端获取数据,你可以这样调用它:

import 'dart:async';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String? dataFromBackend;
  bool loading = false;

  void fetchDataFromBackend() async {
    setState(() {
      loading = true;
    });

    try {
      // 调用后端服务获取数据
      String result = await CarpBackend.fetchData('some-endpoint');
      setState(() {
        dataFromBackend = result;
        loading = false;
      });
    } catch (error) {
      print('Error fetching data: $error');
      setState(() {
        loading = false;
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('CarpBackend Example'),
      ),
      body: Center(
        child: loading ?
          CircularProgressIndicator() :
          Text(dataFromBackend ?? 'No data fetched yet. Tap to fetch.'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: fetchDataFromBackend,
        tooltip: 'Fetch Data',
        child: Icon(Icons.cloud_download),
      ),
    );
  }
}

4. 错误处理和日志记录

在实际应用中,添加适当的错误处理和日志记录是非常重要的。你可以使用try-catch块来捕获并处理异常,并使用print或更高级的日志记录库(如logger)来记录日志。

注意事项

  • 文档和API参考:务必查阅carp_backend插件的官方文档和API参考,以获取最新的使用方法和最佳实践。
  • 依赖管理:确保pubspec.yaml文件中的依赖版本与你的Flutter SDK版本兼容。
  • 安全性:不要在客户端代码中硬编码敏感信息(如API密钥)。考虑使用环境变量或安全的密钥管理服务。

这个示例提供了一个基本的框架,展示了如何在Flutter项目中集成和使用carp_backend插件。根据实际需求,你可能需要添加更多的功能和错误处理逻辑。

回到顶部