Skip to content

Commit 3b0ba04

Browse files
refactor: split image parsers into platform-specific implementations (#288)
* update image svg iamage src * refactor: split image parsers into platform-specific implementations for web and IO
1 parent 6005dee commit 3b0ba04

File tree

8 files changed

+317
-160
lines changed

8 files changed

+317
-160
lines changed

examples/stac_gallery/assets/json/image_example.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@
116116
"children": [
117117
{
118118
"type": "image",
119-
"src": "https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/android.svg",
119+
"src": "http://upload.wikimedia.org/wikipedia/commons/0/02/SVG_logo.svg",
120120
"height": 100,
121121
"width": 100
122122
},
Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import 'dart:io';
2-
31
import 'package:flutter/material.dart';
42
import 'package:freezed_annotation/freezed_annotation.dart';
53
import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart';
64
import 'package:stac/src/parsers/widgets/stac_rect/stac_rect.dart';
75
import 'package:stac/stac.dart';
86

7+
export 'stac_decoration_image_parser_web.dart'
8+
if (dart.library.io) 'stac_decoration_image_parser_io.dart';
9+
910
part 'stac_decoration_image.freezed.dart';
1011
part 'stac_decoration_image.g.dart';
1112

@@ -31,38 +32,3 @@ abstract class StacDecorationImage with _$StacDecorationImage {
3132
factory StacDecorationImage.fromJson(Map<String, dynamic> json) =>
3233
_$StacDecorationImageFromJson(json);
3334
}
34-
35-
extension StacDecorationImageParser on StacDecorationImage? {
36-
DecorationImage? get parse {
37-
if (this?.src == null) return null;
38-
39-
late ImageProvider image;
40-
switch (this?.imageType) {
41-
case StacDecorationImageType.network:
42-
image = NetworkImage(this?.src ?? '');
43-
break;
44-
case StacDecorationImageType.file:
45-
image = FileImage(File(this?.src ?? ''));
46-
break;
47-
case StacDecorationImageType.asset:
48-
image = AssetImage(this?.src ?? '');
49-
break;
50-
default:
51-
return null;
52-
}
53-
54-
return DecorationImage(
55-
image: image,
56-
fit: this?.fit,
57-
alignment: this?.alignment.value ?? Alignment.center,
58-
centerSlice: this?.centerSlice?.parse,
59-
repeat: this?.repeat ?? ImageRepeat.noRepeat,
60-
matchTextDirection: this?.matchTextDirection ?? false,
61-
scale: this?.scale.parse ?? 1.0,
62-
opacity: this?.opacity.parse ?? 1.0,
63-
filterQuality: this?.filterQuality ?? FilterQuality.low,
64-
invertColors: this?.invertColors ?? false,
65-
isAntiAlias: this?.isAntiAlias ?? false,
66-
);
67-
}
68-
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import 'dart:io';
2+
3+
import 'package:flutter/material.dart';
4+
import 'package:stac/src/parsers/widgets/stac_decoration_image/stac_decoration_image.dart';
5+
import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart';
6+
import 'package:stac/src/parsers/widgets/stac_rect/stac_rect.dart';
7+
8+
extension StacDecorationImageParser on StacDecorationImage? {
9+
DecorationImage? get parse {
10+
if (this?.src == null) return null;
11+
12+
late ImageProvider image;
13+
switch (this?.imageType) {
14+
case StacDecorationImageType.network:
15+
image = NetworkImage(this?.src ?? '');
16+
break;
17+
case StacDecorationImageType.file:
18+
image = FileImage(File(this?.src ?? ''));
19+
break;
20+
case StacDecorationImageType.asset:
21+
image = AssetImage(this?.src ?? '');
22+
break;
23+
default:
24+
return null;
25+
}
26+
27+
return DecorationImage(
28+
image: image,
29+
fit: this?.fit,
30+
alignment: this?.alignment.value ?? Alignment.center,
31+
centerSlice: this?.centerSlice?.parse,
32+
repeat: this?.repeat ?? ImageRepeat.noRepeat,
33+
matchTextDirection: this?.matchTextDirection ?? false,
34+
scale: this?.scale.parse ?? 1.0,
35+
opacity: this?.opacity.parse ?? 1.0,
36+
filterQuality: this?.filterQuality ?? FilterQuality.low,
37+
invertColors: this?.invertColors ?? false,
38+
isAntiAlias: this?.isAntiAlias ?? false,
39+
);
40+
}
41+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:stac/src/parsers/widgets/stac_decoration_image/stac_decoration_image.dart';
3+
import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart';
4+
import 'package:stac/src/parsers/widgets/stac_rect/stac_rect.dart';
5+
import 'package:stac_logger/stac_logger.dart';
6+
7+
extension StacDecorationImageParser on StacDecorationImage? {
8+
DecorationImage? get parse {
9+
if (this?.src == null) return null;
10+
11+
late ImageProvider image;
12+
switch (this?.imageType) {
13+
case StacDecorationImageType.network:
14+
image = NetworkImage(this?.src ?? '');
15+
break;
16+
case StacDecorationImageType.file:
17+
Log.w("StacDecorationImageParser: File image not supported on web");
18+
break;
19+
case StacDecorationImageType.asset:
20+
image = AssetImage(this?.src ?? '');
21+
break;
22+
default:
23+
return null;
24+
}
25+
26+
return DecorationImage(
27+
image: image,
28+
fit: this?.fit,
29+
alignment: this?.alignment.value ?? Alignment.center,
30+
centerSlice: this?.centerSlice?.parse,
31+
repeat: this?.repeat ?? ImageRepeat.noRepeat,
32+
matchTextDirection: this?.matchTextDirection ?? false,
33+
scale: this?.scale.parse ?? 1.0,
34+
opacity: this?.opacity.parse ?? 1.0,
35+
filterQuality: this?.filterQuality ?? FilterQuality.low,
36+
invertColors: this?.invertColors ?? false,
37+
isAntiAlias: this?.isAntiAlias ?? false,
38+
);
39+
}
40+
}
Lines changed: 6 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -1,123 +1,7 @@
1-
import 'dart:io';
1+
// This file handles conditional imports based on platform
2+
// It exports the appropriate implementation of StacImageParser
23

3-
import 'package:cached_network_image/cached_network_image.dart';
4-
import 'package:flutter/cupertino.dart';
5-
import 'package:flutter_svg/flutter_svg.dart';
6-
import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart';
7-
import 'package:stac/src/utils/color_utils.dart';
8-
import 'package:stac/src/utils/widget_type.dart';
9-
import 'package:stac_framework/stac_framework.dart';
10-
11-
import 'stac_image.dart';
12-
13-
class StacImageParser extends StacParser<StacImage> {
14-
const StacImageParser();
15-
16-
@override
17-
String get type => WidgetType.image.name;
18-
19-
@override
20-
StacImage getModel(Map<String, dynamic> json) => StacImage.fromJson(json);
21-
22-
@override
23-
Widget parse(BuildContext context, StacImage model) {
24-
switch (model.imageType) {
25-
case StacImageType.network:
26-
return _networkImage(model, context);
27-
case StacImageType.file:
28-
return _fileImage(model, context);
29-
case StacImageType.asset:
30-
return _assetImage(model, context);
31-
}
32-
}
33-
34-
Widget _networkImage(StacImage model, BuildContext context) {
35-
if (!model.src.contains(".svg")) {
36-
return CachedNetworkImage(
37-
imageUrl: model.src,
38-
alignment: model.alignment.value,
39-
color: model.color?.toColor(context),
40-
width: model.width?.parse,
41-
height: model.height?.parse,
42-
fit: model.fit,
43-
errorWidget: (context, error, stackTrace) {
44-
return const SizedBox();
45-
},
46-
);
47-
} else {
48-
return SvgPicture.network(
49-
model.src,
50-
alignment: model.alignment.value,
51-
colorFilter: model.color != null
52-
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
53-
: null,
54-
width: model.width?.parse,
55-
height: model.height?.parse,
56-
fit: model.fit ?? BoxFit.contain,
57-
errorBuilder: (context, error, stackTrace) {
58-
return const SizedBox();
59-
},
60-
);
61-
}
62-
}
63-
64-
Widget _fileImage(StacImage model, BuildContext context) {
65-
if (!model.src.contains(".svg")) {
66-
return Image.file(
67-
File(model.src),
68-
alignment: model.alignment.value,
69-
color: model.color?.toColor(context),
70-
width: model.width?.parse,
71-
height: model.height?.parse,
72-
fit: model.fit,
73-
errorBuilder: (context, error, stackTrace) {
74-
return const SizedBox();
75-
},
76-
);
77-
} else {
78-
return SvgPicture.file(
79-
File(model.src),
80-
alignment: model.alignment.value,
81-
colorFilter: model.color != null
82-
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
83-
: null,
84-
width: model.width?.parse,
85-
height: model.height?.parse,
86-
fit: model.fit ?? BoxFit.contain,
87-
errorBuilder: (context, error, stackTrace) {
88-
return const SizedBox();
89-
},
90-
);
91-
}
92-
}
93-
94-
Widget _assetImage(StacImage model, BuildContext context) {
95-
if (!model.src.endsWith(".svg")) {
96-
return Image.asset(
97-
model.src,
98-
alignment: model.alignment.value,
99-
color: model.color?.toColor(context),
100-
width: model.width?.parse,
101-
height: model.height?.parse,
102-
fit: model.fit,
103-
errorBuilder: (context, error, stackTrace) {
104-
return const SizedBox();
105-
},
106-
);
107-
} else {
108-
return SvgPicture.asset(
109-
model.src,
110-
alignment: model.alignment.value,
111-
colorFilter: model.color != null
112-
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
113-
: null,
114-
width: model.width?.parse,
115-
height: model.height?.parse,
116-
fit: model.fit ?? BoxFit.contain,
117-
errorBuilder: (context, error, stackTrace) {
118-
return const SizedBox();
119-
},
120-
);
121-
}
122-
}
123-
}
4+
export 'stac_image_parser_stub.dart'
5+
if (dart.library.io) 'stac_image_parser_io.dart'
6+
if (dart.library.html) 'stac_image_parser_web.dart'
7+
if (dart.library.wasm) 'stac_image_parser_web.dart';
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import 'dart:io';
2+
3+
import 'package:cached_network_image/cached_network_image.dart';
4+
import 'package:flutter/material.dart';
5+
import 'package:flutter_svg/svg.dart';
6+
import 'package:stac/src/parsers/widgets/stac_double/stac_double.dart';
7+
import 'package:stac/src/utils/widget_type.dart';
8+
import 'package:stac/stac.dart';
9+
10+
class StacImageParser extends StacParser<StacImage> {
11+
const StacImageParser();
12+
13+
@override
14+
String get type => WidgetType.image.name;
15+
16+
@override
17+
StacImage getModel(Map<String, dynamic> json) => StacImage.fromJson(json);
18+
19+
@override
20+
Widget parse(BuildContext context, StacImage model) {
21+
switch (model.imageType) {
22+
case StacImageType.network:
23+
return _networkImage(model, context);
24+
case StacImageType.file:
25+
return _fileImage(model, context);
26+
case StacImageType.asset:
27+
return _assetImage(model, context);
28+
}
29+
}
30+
31+
Widget _networkImage(StacImage model, BuildContext context) {
32+
if (model.src.contains(".svg")) {
33+
return SvgPicture.network(
34+
model.src,
35+
alignment: model.alignment.value,
36+
colorFilter: model.color != null
37+
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
38+
: null,
39+
width: model.width?.parse,
40+
height: model.height?.parse,
41+
fit: model.fit ?? BoxFit.contain,
42+
errorBuilder: (context, error, stackTrace) {
43+
return const SizedBox();
44+
},
45+
);
46+
} else {
47+
return CachedNetworkImage(
48+
imageUrl: model.src,
49+
alignment: model.alignment.value,
50+
color: model.color?.toColor(context),
51+
width: model.width?.parse,
52+
height: model.height?.parse,
53+
fit: model.fit,
54+
errorWidget: (context, error, stackTrace) {
55+
return const SizedBox();
56+
},
57+
);
58+
}
59+
}
60+
61+
Widget _fileImage(StacImage model, BuildContext context) {
62+
if (!model.src.contains(".svg")) {
63+
return Image.file(
64+
File(model.src),
65+
alignment: model.alignment.value,
66+
color: model.color?.toColor(context),
67+
width: model.width?.parse,
68+
height: model.height?.parse,
69+
fit: model.fit,
70+
errorBuilder: (context, error, stackTrace) {
71+
return const SizedBox();
72+
},
73+
);
74+
} else {
75+
return SvgPicture.file(
76+
File(model.src),
77+
alignment: model.alignment.value,
78+
colorFilter: model.color != null
79+
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
80+
: null,
81+
width: model.width?.parse,
82+
height: model.height?.parse,
83+
fit: model.fit ?? BoxFit.contain,
84+
errorBuilder: (context, error, stackTrace) {
85+
return const SizedBox();
86+
},
87+
);
88+
}
89+
}
90+
91+
Widget _assetImage(StacImage model, BuildContext context) {
92+
if (!model.src.endsWith(".svg")) {
93+
return Image.asset(
94+
model.src,
95+
alignment: model.alignment.value,
96+
color: model.color?.toColor(context),
97+
width: model.width?.parse,
98+
height: model.height?.parse,
99+
fit: model.fit,
100+
errorBuilder: (context, error, stackTrace) {
101+
return const SizedBox();
102+
},
103+
);
104+
} else {
105+
return SvgPicture.asset(
106+
model.src,
107+
alignment: model.alignment.value,
108+
colorFilter: model.color != null
109+
? ColorFilter.mode(model.color.toColor(context)!, BlendMode.srcIn)
110+
: null,
111+
width: model.width?.parse,
112+
height: model.height?.parse,
113+
fit: model.fit ?? BoxFit.contain,
114+
errorBuilder: (context, error, stackTrace) {
115+
return const SizedBox();
116+
},
117+
);
118+
}
119+
}
120+
}

0 commit comments

Comments
 (0)