Flutter医疗数据交互插件fhir_primitives的使用

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

Flutter医疗数据交互插件fhir_primitives的使用

fhir_primitives 是一个小型包,包含所有在Dart包中相同的FHIR(Fast Healthcare Interoperability Resources)原语。此包允许验证FHIR原语。

支持的原值

以下是一些支持的原值:

  • base64binary
  • boolean
  • canonical
  • code
  • dateTime
  • date
  • decimal
  • id
  • instant
  • integer
  • integer64(虽然这仅在R5中官方定义)
  • markdown
  • oid
  • positiveInt
  • time
  • unsignedInt
  • uri
  • url
  • uuid
  • xhtml

这些原值可以在 HL7网站 上找到。

类结构

每个类的结构大致相同,包括至少一个通用构造函数以及 fromJson() 方法。在构造函数中,值会被验证,通常使用来自FHIR网站的正则表达式。即使输入的值不合法,toJson() 方法也会始终返回你输入的数据。每个类都有一个名为 .value 的getter,该方法会返回类中的值(如果可用且有效)。

示例

final id1 = FhirId('12345');
final id2 = FhirId('123_45');
print(id1.value); // 输出:12345
print(id2.value); // 输出:null - 因为根据正则表达式这不是一个有效的ID

DateTimes

处理日期和时间特别复杂,因为它们涉及到精度匹配等问题。我们尽可能地遵循FHIR规范,包括在使用大于或小于操作符时匹配精度(这对于CQL和FHIRPath非常重要)。

基础类

该包还包括一个基础类,所有其他FHIR对象都是从该类扩展或实现的。

完整示例Demo

下面是一个完整的示例,展示了如何使用 fhir_primitives 包来处理各种FHIR原值:

import 'package:fhir_primitives/fhir_primitives.dart';
import 'package:test/test.dart';

void main() {
  // 测试FhirDateTime
  test('fdtyearstring', () {
    expect(FhirDateTime('2020').toString(), '2020');
    expect(FhirDateTime('2020').precision, FhirDateTimePrecision.yyyy);
    expect(FhirDateTime('2020').value, DateTime(2020));
  });

  test('fdtyearmonthstring', () {
    expect(FhirDateTime('2020-12').toString(), '2020-12');
    expect(FhirDateTime('2020-12').precision, FhirDateTimePrecision.yyyy_MM);
    expect(FhirDateTime('2020-12').value, DateTime(2020, 12));
    expect(() => FhirDateTime('2020-Bla'), returnsNormally);
    expect(FhirDateTime('2020-Bla').isValid, false);
    expect(FhirDateTime('2020-Bla').value, DateTime(2020));
  });

  // 测试FhirDate
  test('dateyearstring', () {
    expect(FhirDate('2020').toString(), '2020');
    expect(FhirDate('2020').precision, FhirDateTimePrecision.yyyy);
    expect(FhirDate('2020').value, DateTime(2020));
  });

  test('dateyearmonthstring', () {
    expect(FhirDate('2020-12').toString(), '2020-12');
    expect(FhirDate('2020-12').precision, FhirDateTimePrecision.yyyy_MM);
    expect(FhirDate('2020-12').value, DateTime(2020, 12));
    expect(() => FhirDate('2020-Bla'), returnsNormally);
    expect(FhirDate('2020-Bla').isValid, false);
    expect(FhirDate('2020-Bla').value, DateTime(2020));
  });

  // 测试FhirInstant
  test('instant', () {
    expect(FhirInstant('2015-02-07T13:28:17.239+02:00').isValid, true);
    expect(FhirInstant('2017-01-01T00:00:00Z').isValid, true);
    expect(FhirInstant('2020-12').toJson(), '2020-12');
    expect(FhirInstant('2020-12').isValid, false);
    expect(FhirInstant('2020-12').value, DateTime(2020, 12));
    expect(FhirInstant(DateTime.now()).isValid, true);
    expect(() => FhirInstant('2020-Bla'), returnsNormally);
    expect(FhirInstant('2020-Bla').isValid, false);
    expect(FhirInstant('2020-Bla').value, DateTime(2020));
  });

  // 测试FhirBase64Binary
  test('Base64Binary', () {
    expect(FhirBase64Binary('2020').toString(), '2020');
    expect(FhirBase64Binary('2020').value, '2020');
    expect(FhirBase64Binary('').value, '');
    expect(FhirBase64Binary('_').toString(), '_');
    expect(FhirBase64Binary('_').value, null);
    expect(FhirBase64Binary('AAA').isValid, false);
    expect(FhirBase64Binary('AAAA').isValid, true);
  });

  // 测试FhirBoolean
  test('Boolean', () {
    expect(FhirBoolean(true).toString(), 'true');
    expect(FhirBoolean(true).value, true);
    expect(FhirBoolean(true).toJson(), true);
    expect(FhirBoolean('true').toString(), 'true');
    expect(FhirBoolean('true').value, true);
    expect(FhirBoolean('true').toJson(), 'true');
    expect(FhirBoolean('nope').toString(), 'nope');
    expect(FhirBoolean('nope').value, null);
    expect(FhirBoolean('nope').isValid, false);
    expect(FhirBoolean('nope').toJson(), 'nope');
  });

  // 测试FhirCanonical
  test('Canonical', () {
    expect(FhirCanonical('Patient/123456').toString(), 'Patient/123456');
    expect(FhirCanonical('Patient/123456').toJson(), 'Patient/123456');
    expect(FhirCanonical('Patient/123456').value, Uri.parse('Patient/123456'));
    expect(FhirCanonical('http://Patient.com/123456').toString(),
        'http://Patient.com/123456');
    expect(FhirCanonical('http://Patient.com/123456').toJson(),
        'http://Patient.com/123456');
    expect(FhirCanonical('http://Patient.com/123456').value,
        Uri.parse('http://Patient.com/123456'));
    expect(FhirCanonical('___').toString(), '___');
    expect(FhirCanonical('  ').value, null);
    expect(FhirCanonical('___').toJson(), '___');
  });

  // 测试FhirCode
  test('Code', () {
    expect(FhirCode('Patient/123456').toString(), 'Patient/123456');
    expect(FhirCode('Patient/123456').toJson(), 'Patient/123456');
    expect(FhirCode('Patient/123456').value, 'Patient/123456');
    expect(FhirCode('http://Patient.com/123456').toString(),
        'http://Patient.com/123456');
    expect(FhirCode('http://Patient.com/123456').toJson(),
        'http://Patient.com/123456');
    expect(FhirCode('http://Patient.com/123456').value,
        'http://Patient.com/123456');
    expect(FhirCode('___').toString(), '___');
    expect(FhirCode('___').toJson(), '___');
    expect(FhirCode('').value, null);
  });

  // 测试FhirDecimal
  test('Decimal', () {
    expect(FhirDecimal(1.0).toString(), '1.0');
    expect(FhirDecimal(1.0).toJson(), 1.0);
    expect(FhirDecimal(1.0).value, 1.0);
    expect(FhirDecimal(1).toString(), '1');
    expect(FhirDecimal(1).toJson(), 1);
    expect(FhirDecimal(1).value, 1.0);
  });

  // 测试FhirUri
  test('FhirUri', () {
    expect(FhirUri('Patient/12345').toString(), 'Patient/12345');
    expect(FhirUri('Patient/12345').toJson(), 'Patient/12345');
    expect(FhirUri('Patient/12345').value, Uri.parse('Patient/12345'));
    expect(FhirUri('http://Patient.com/12345').toString(),
        'http://Patient.com/12345');
    expect(FhirUri('http://Patient.com/12345').toJson(),
        'http://Patient.com/12345');
    expect(FhirUri('http://Patient.com/12345').value,
        Uri.parse('http://Patient.com/12345'));
    expect(FhirUri('_').toString(), '_');
    expect(FhirUri('_').toJson(), '_');
    expect(FhirUri('  ""@^|`:/#?&@%+~ ').value, null);
  });

  // 测试FhirUrl
  test('FhirUrl', () {
    expect(FhirUrl('Patient/12345').toString(), 'Patient/12345');
    expect(FhirUrl('Patient/12345').toJson(), 'Patient/12345');
    expect(FhirUrl('Patient/12345').value, Uri.parse('Patient/12345'));
    expect(FhirUrl('http://Patient.com/12345').toString(),
        'http://Patient.com/12345');
    expect(FhirUrl('http://Patient.com/12345').toJson(),
        'http://Patient.com/12345');
    expect(FhirUrl('http://Patient.com/12345').value,
        Uri.parse('http://Patient.com/12345'));
    expect(FhirUrl('_').toString(), '_');
    expect(FhirUrl('_').toJson(), '_');
    expect(FhirUrl('  ""@^|`:/#?&@%+~ ').value, null);
  });

  // 测试FhirId
  test('Id', () {
    expect(FhirId('Patient/12345').toString(), 'Patient/12345');
    expect(FhirId('Patient/12345').toJson(), 'Patient/12345');
    expect(FhirId('Patient/12345').value, null);
    expect(FhirId('Patient-12345').toString(), 'Patient-12345');
    expect(FhirId('Patient-12345').toJson(), 'Patient-12345');
    expect(FhirId('Patient-12345').value, 'Patient-12345');
    const id1String =
        '1111111111222222222233333333334444444444555555555566666666667777';
    const id2String =
        '11111111112222222222333333333344444444445555555555666666666677777';
    expect(FhirId(id1String).toString(), id1String);
    expect(FhirId(id1String).toJson(), id1String);
    expect(FhirId(id1String).value, id1String);
    expect(FhirId(id2String).toString(), id2String);
    expect(FhirId(id2String).toJson(), id2String);
    expect(FhirId(id2String).value, null);
    expect(FhirId(id1String).toString().length + 1,
        FhirId(id2String).toString().length);
    expect(FhirId(id1String).toString().length, 64);
    expect(FhirId(id2String).toString().length, 65);
  });

  // 测试FhirInteger
  test('Integer', () {
    expect(FhirInteger(1).toString(), '1');
    expect(FhirInteger(1).toJson(), 1);
    expect(FhirInteger(1).value, 1);
  });
}

更多关于Flutter医疗数据交互插件fhir_primitives的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter医疗数据交互插件fhir_primitives的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用fhir_primitives库进行医疗数据交互的示例代码。fhir_primitives是Flutter/Dart中用于处理FHIR(Fast Healthcare Interoperability Resources)数据的一个基础库。FHIR是一种用于医疗信息交换的标准。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  fhir: ^x.y.z  # 请替换为最新版本号
  fhir_primitives: ^a.b.c  # 请替换为最新版本号

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

2. 导入库

在你的Dart文件中导入必要的库:

import 'package:fhir/r4.dart' as fhir;
import 'package:fhir_primitives/fhir_primitives.dart';

3. 使用fhir_primitives创建和解析FHIR资源

下面是一个示例,展示如何使用fhir_primitives创建一个简单的Patient资源,并将其序列化为JSON格式,然后再从JSON格式反序列化为Patient对象。

void main() {
  // 创建一个Patient资源
  var patient = fhir.Patient()
    ..id = Id('12345')
    ..active = Boolean(true)
    ..name = [
      fhir.HumanName()
        ..family = 'Doe'
        ..given = ['John']
    ]
    ..gender = fhir.AdministrativeGender.male
    ..birthDate = Date('1990-01-01');

  // 将Patient资源序列化为JSON
  var jsonData = patient.toJson();
  print('Serialized JSON: $jsonData');

  // 从JSON反序列化为Patient对象
  var patientFromJson = fhir.Patient.fromJson(jsonData);
  print('Deserialized Patient: ${patientFromJson.toJson()}');
}

4. 在Flutter Widget中使用

在Flutter应用中,你可能希望在UI中显示这些数据。下面是一个简单的例子,展示如何在Text widget中显示患者的名字:

import 'package:flutter/material.dart';
import 'package:fhir/r4.dart' as fhir;
import 'package:fhir_primitives/fhir_primitives.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 创建一个Patient资源
    var patient = fhir.Patient()
      ..id = Id('12345')
      ..active = Boolean(true)
      ..name = [
        fhir.HumanName()
          ..family = 'Doe'
          ..given = ['John']
      ]
      ..gender = fhir.AdministrativeGender.male
      ..birthDate = Date('1990-01-01');

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter FHIR Example'),
        ),
        body: Center(
          child: Text('Patient Name: ${patient.name.first.given.join(' ')} ${patient.name.first.family}'),
        ),
      ),
    );
  }
}

注意事项

  1. 版本兼容性:确保你使用的fhirfhir_primitives库的版本是兼容的。
  2. 错误处理:在实际应用中,添加适当的错误处理逻辑,比如处理JSON解析错误或网络请求错误。
  3. 数据验证:在使用FHIR资源之前,验证数据的完整性和正确性是非常重要的。

这个示例展示了如何在Flutter项目中使用fhir_primitives库进行基本的医疗数据交互。根据你的具体需求,你可能需要更深入地了解FHIR标准和fhir库的其他功能。

回到顶部