Flutter医疗数据交互插件fhir_primitives的使用
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
更多关于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
文件中添加fhir
和fhir_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}'),
),
),
);
}
}
注意事项
- 版本兼容性:确保你使用的
fhir
和fhir_primitives
库的版本是兼容的。 - 错误处理:在实际应用中,添加适当的错误处理逻辑,比如处理JSON解析错误或网络请求错误。
- 数据验证:在使用FHIR资源之前,验证数据的完整性和正确性是非常重要的。
这个示例展示了如何在Flutter项目中使用fhir_primitives
库进行基本的医疗数据交互。根据你的具体需求,你可能需要更深入地了解FHIR标准和fhir
库的其他功能。