|
@@ -31,14 +31,18 @@ class TerminalImage {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+class QuickFWidget extends StatelessWidget implements FWidget {
|
|
|
+ const QuickFWidget(this.child, {Key? key}) : super(key: key);
|
|
|
+ final Widget child;
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) => child;
|
|
|
+}
|
|
|
+
|
|
|
/// 所有图片的入口
|
|
|
-class ContentImage extends StatelessWidget implements FWidget {
|
|
|
+class FContentImage extends StatelessWidget implements FWidget {
|
|
|
/// 图片参数
|
|
|
final RemedicalInfoDTO? remedicalInfo;
|
|
|
|
|
|
- /// 图片地址
|
|
|
- final TerminalImage terminalImage;
|
|
|
-
|
|
|
/// 是否是测量页面
|
|
|
final bool? isMeasure;
|
|
|
|
|
@@ -48,15 +52,15 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
/// 图片单机事件
|
|
|
final VoidCallback? onTap;
|
|
|
|
|
|
- /// 扫查部位
|
|
|
- final String? application;
|
|
|
-
|
|
|
/// AI 良恶性
|
|
|
late final DiagnosisConclusionEnum diagnosisConclusion =
|
|
|
remedicalInfo?.diagnosisConclusion ?? DiagnosisConclusionEnum.NotRequired;
|
|
|
|
|
|
/// 图片类型
|
|
|
- final RemedicalFileDataTypeEnum fileDataType;
|
|
|
+ late RemedicalFileDataTypeEnum? fileDataType;
|
|
|
+
|
|
|
+ /// 图片地址
|
|
|
+ late TerminalImage? terminalImage;
|
|
|
|
|
|
/// AI测量的器官
|
|
|
late final List<DiagnosisOrganEnum>? diagnosisOrgans =
|
|
@@ -78,30 +82,39 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
/// 是否是选择状态
|
|
|
final bool isSelectStutas;
|
|
|
|
|
|
- ContentImage({
|
|
|
+ FContentImage({
|
|
|
Key? key,
|
|
|
- required this.terminalImage,
|
|
|
- required this.fileDataType,
|
|
|
+ this.terminalImage,
|
|
|
+ this.fileDataType,
|
|
|
this.remedicalInfo,
|
|
|
this.isMeasure = false,
|
|
|
this.onDoubleTap,
|
|
|
this.onTap,
|
|
|
this.isSelectStutas = false,
|
|
|
- this.application,
|
|
|
}) : super(key: key);
|
|
|
|
|
|
@override
|
|
|
- Widget build(BuildContext context) {
|
|
|
+ FWidget build(BuildContext context) {
|
|
|
+ if (terminalImage == null) {
|
|
|
+ terminalImage = new TerminalImage(
|
|
|
+ previewUrl: remedicalInfo?.terminalImages?.previewUrl ?? '',
|
|
|
+ imageUrl: remedicalInfo?.terminalImages?.imageUrl ?? '',
|
|
|
+ coverImageUrl: remedicalInfo?.terminalImages?.coverImageUrl ?? '');
|
|
|
+ }
|
|
|
+ if (fileDataType == null) {
|
|
|
+ fileDataType = remedicalInfo?.fileDataType;
|
|
|
+ }
|
|
|
+
|
|
|
if (isSelectStutas) {
|
|
|
- return Container(
|
|
|
+ return FContainer(
|
|
|
width: 190,
|
|
|
height: 160,
|
|
|
color: Colors.black,
|
|
|
- child: Stack(
|
|
|
+ child: FStack(
|
|
|
children: [
|
|
|
- Center(
|
|
|
- child: Image.network(
|
|
|
- terminalImage.previewUrl!,
|
|
|
+ FCenter(
|
|
|
+ child: FImage.network(
|
|
|
+ terminalImage!.previewUrl!,
|
|
|
errorBuilder: ((context, error, stackTrace) {
|
|
|
return Container(
|
|
|
child: Text('error'),
|
|
@@ -113,14 +126,13 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
),
|
|
|
);
|
|
|
} else
|
|
|
- return _buildContentImage(
|
|
|
- fileDataType,
|
|
|
- terminalImage.previewUrl!,
|
|
|
+ return _buildFContentImage(
|
|
|
+ fileDataType!,
|
|
|
+ terminalImage!.previewUrl!,
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- /// 0
|
|
|
- Widget _buildContentImage(
|
|
|
+ FWidget _buildFContentImage(
|
|
|
RemedicalFileDataTypeEnum fileDataType,
|
|
|
String previewUrl,
|
|
|
) {
|
|
@@ -137,16 +149,136 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
previewUrl,
|
|
|
);
|
|
|
default:
|
|
|
- return Container(
|
|
|
- child: Text('error'),
|
|
|
+ return FContainer(
|
|
|
+ child: FText('error'),
|
|
|
);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Widget _buildVidMovieCard(
|
|
|
+ FWidget _buildLeftAIOrCarotidLogo() {
|
|
|
+ if (hasDiagnosisOrgans) {
|
|
|
+ return FPositioned(
|
|
|
+ bottom: 5,
|
|
|
+ left: 5,
|
|
|
+ child: _buildAIDiagnosticOrgans(),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ if (isCarotidResult) {
|
|
|
+ return FPositioned(
|
|
|
+ bottom: 5,
|
|
|
+ left: 5,
|
|
|
+ child: FIcon(
|
|
|
+ FIcons.arteria_carotis,
|
|
|
+ color: Colors.lightBlue,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return FPositioned(
|
|
|
+ bottom: 5,
|
|
|
+ left: 5,
|
|
|
+ child: FText(
|
|
|
+ remedicalInfo?.application ?? "",
|
|
|
+ style: TextStyle(
|
|
|
+ color: Colors.white,
|
|
|
+ fontSize: 8,
|
|
|
+ overflow: TextOverflow.ellipsis,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ FWidget _buildRigthAIText() {
|
|
|
+ if (hasDiagnosisOrgans) {
|
|
|
+ return FPositioned(
|
|
|
+ bottom: 5,
|
|
|
+ right: 5,
|
|
|
+ child: QuickFWidget(
|
|
|
+ Tooltip(
|
|
|
+ textStyle: TextStyle(
|
|
|
+ fontSize: 16,
|
|
|
+ color: Colors.white,
|
|
|
+ ),
|
|
|
+ message: _buildAIText(diagnosisConclusion),
|
|
|
+ child: FText(
|
|
|
+ 'AI',
|
|
|
+ style: TextStyle(
|
|
|
+ color: _buildAITextColor(
|
|
|
+ diagnosisConclusion,
|
|
|
+ ),
|
|
|
+ fontSize: 20,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isCarotidResult) {
|
|
|
+ return FPositioned(
|
|
|
+ bottom: 5,
|
|
|
+ right: 5,
|
|
|
+ child: FIcon(
|
|
|
+ FIcons.three_dimensional,
|
|
|
+ color: Colors.lightBlue,
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+ return FSizedBox();
|
|
|
+ }
|
|
|
+
|
|
|
+ FWidget _buildVidMovieCard(
|
|
|
String previewUrl,
|
|
|
) {
|
|
|
- return Listener(
|
|
|
+ return FContainer(
|
|
|
+ width: 190,
|
|
|
+ height: 160,
|
|
|
+ color: Colors.black,
|
|
|
+ child: FStack(
|
|
|
+ children: [
|
|
|
+ FCenter(
|
|
|
+ child: FImage.network(
|
|
|
+ previewUrl,
|
|
|
+ errorBuilder: ((context, error, stackTrace) {
|
|
|
+ return Container(
|
|
|
+ child: Text('error'),
|
|
|
+ );
|
|
|
+ }),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ _buildLeftAIOrCarotidLogo(),
|
|
|
+ _buildRigthAIText(),
|
|
|
+ FInkWell(
|
|
|
+ onDoubleTap: () {
|
|
|
+ onDoubleTap?.call();
|
|
|
+ },
|
|
|
+ onTap: () {
|
|
|
+ onTap?.call();
|
|
|
+ },
|
|
|
+ child: Center(
|
|
|
+ child: Container(
|
|
|
+ child: Icon(
|
|
|
+ Icons.play_circle_outline_rounded,
|
|
|
+ color: Colors.white,
|
|
|
+ size: 50,
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ FWidget _buildImageCard(
|
|
|
+ String previewUrl,
|
|
|
+ ) {
|
|
|
+ return FInkWell(
|
|
|
+ onDoubleTap: () {
|
|
|
+ onDoubleTap?.call();
|
|
|
+ },
|
|
|
+ onTap: () {
|
|
|
+ onTap?.call();
|
|
|
+ },
|
|
|
child: Container(
|
|
|
width: 190,
|
|
|
height: 160,
|
|
@@ -163,179 +295,14 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
}),
|
|
|
),
|
|
|
),
|
|
|
- hasDiagnosisOrgans
|
|
|
- ? Positioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: _buildAIDiagnosticOrgans(),
|
|
|
- )
|
|
|
- : FPositioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: FText(
|
|
|
- application!,
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 8,
|
|
|
- overflow: TextOverflow.ellipsis,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- if (isCarotidResult) ...[
|
|
|
- Positioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: FIcon(
|
|
|
- FIcons.arteria_carotis,
|
|
|
- color: Colors.lightBlue,
|
|
|
- ),
|
|
|
- ),
|
|
|
- Positioned(
|
|
|
- bottom: 5,
|
|
|
- right: 5,
|
|
|
- child: FIcon(
|
|
|
- FIcons.three_dimensional,
|
|
|
- color: Colors.lightBlue,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ],
|
|
|
- InkWell(
|
|
|
- onDoubleTap: () {
|
|
|
- onDoubleTap?.call();
|
|
|
- },
|
|
|
- onTap: () {
|
|
|
- onTap?.call();
|
|
|
- },
|
|
|
- child: Center(
|
|
|
- child: Container(
|
|
|
- child: Icon(
|
|
|
- Icons.play_circle_outline_rounded,
|
|
|
- color: Colors.white,
|
|
|
- size: 50,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- isShowDiagnosisOrgans
|
|
|
- ? Positioned(
|
|
|
- bottom: 5,
|
|
|
- right: 5,
|
|
|
- child: Tooltip(
|
|
|
- textStyle: TextStyle(
|
|
|
- fontSize: 16,
|
|
|
- color: Colors.white,
|
|
|
- ),
|
|
|
- message: _buildAIText(diagnosisConclusion),
|
|
|
- child: Text(
|
|
|
- 'AI',
|
|
|
- style: TextStyle(
|
|
|
- color: _buildAITextColor(
|
|
|
- diagnosisConclusion,
|
|
|
- ),
|
|
|
- fontSize: 20,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- )
|
|
|
- : const SizedBox(),
|
|
|
+ _buildLeftAIOrCarotidLogo(),
|
|
|
+ _buildRigthAIText(),
|
|
|
],
|
|
|
),
|
|
|
),
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- Widget _buildImageCard(
|
|
|
- String previewUrl,
|
|
|
- ) {
|
|
|
- return Listener(
|
|
|
- child: InkWell(
|
|
|
- onDoubleTap: () {
|
|
|
- onDoubleTap?.call();
|
|
|
- },
|
|
|
- onTap: () {
|
|
|
- onTap?.call();
|
|
|
- },
|
|
|
- child: Container(
|
|
|
- width: 190,
|
|
|
- height: 160,
|
|
|
- color: Colors.black,
|
|
|
- child: Stack(
|
|
|
- children: [
|
|
|
- Center(
|
|
|
- child: Image.network(
|
|
|
- previewUrl,
|
|
|
- errorBuilder: ((context, error, stackTrace) {
|
|
|
- return Container(
|
|
|
- child: Text('error'),
|
|
|
- );
|
|
|
- }),
|
|
|
- ),
|
|
|
- ),
|
|
|
- hasDiagnosisOrgans
|
|
|
- ? Positioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: _buildAIDiagnosticOrgans(),
|
|
|
- )
|
|
|
- : FPositioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: FText(
|
|
|
- application!,
|
|
|
- style: TextStyle(
|
|
|
- color: Colors.white,
|
|
|
- fontSize: 8,
|
|
|
- overflow: TextOverflow.ellipsis,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- if (isCarotidResult) ...[
|
|
|
- Positioned(
|
|
|
- bottom: 5,
|
|
|
- left: 5,
|
|
|
- child: FIcon(
|
|
|
- FIcons.arteria_carotis,
|
|
|
- color: Colors.lightBlue,
|
|
|
- ),
|
|
|
- ),
|
|
|
- Positioned(
|
|
|
- bottom: 5,
|
|
|
- right: 5,
|
|
|
- child: FIcon(
|
|
|
- FIcons.three_dimensional,
|
|
|
- color: Colors.lightBlue,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ],
|
|
|
- isShowDiagnosisOrgans
|
|
|
- ? Positioned(
|
|
|
- bottom: 5,
|
|
|
- right: 5,
|
|
|
- child: Tooltip(
|
|
|
- textStyle: TextStyle(
|
|
|
- fontSize: 16,
|
|
|
- color: Colors.white,
|
|
|
- ),
|
|
|
- message: _buildAIText(diagnosisConclusion),
|
|
|
- child: Text(
|
|
|
- 'AI',
|
|
|
- style: TextStyle(
|
|
|
- color: _buildAITextColor(
|
|
|
- diagnosisConclusion,
|
|
|
- ),
|
|
|
- fontSize: 20,
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- )
|
|
|
- : const SizedBox(),
|
|
|
- ],
|
|
|
- ),
|
|
|
- ),
|
|
|
- ),
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
String _buildAIText(DiagnosisConclusionEnum diagnosisConclusion) {
|
|
|
switch (diagnosisConclusion) {
|
|
|
case DiagnosisConclusionEnum.NotRequired:
|
|
@@ -372,12 +339,12 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Widget _buildAIDiagnosticOrgans() {
|
|
|
+ FWidget _buildAIDiagnosticOrgans() {
|
|
|
switch (diagnosisOrgans?[0]) {
|
|
|
case DiagnosisOrganEnum.Null:
|
|
|
- return const SizedBox();
|
|
|
+ return const FSizedBox();
|
|
|
case DiagnosisOrganEnum.placeHolder_1:
|
|
|
- return const SizedBox();
|
|
|
+ return const FSizedBox();
|
|
|
case DiagnosisOrganEnum.Breast:
|
|
|
return FIcon(
|
|
|
FIcons.fis_breast,
|
|
@@ -423,7 +390,7 @@ class ContentImage extends StatelessWidget implements FWidget {
|
|
|
);
|
|
|
|
|
|
default:
|
|
|
- return Container();
|
|
|
+ return FContainer();
|
|
|
}
|
|
|
}
|
|
|
}
|