Skip to content

Commit 63cff05

Browse files
committed
Merge changes with new fixes (nested links & shrinkwrap)
1 parent 034ff21 commit 63cff05

File tree

4 files changed

+143
-71
lines changed

4 files changed

+143
-71
lines changed

lib/custom_render.dart

Lines changed: 53 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -201,21 +201,24 @@ CustomRender base64ImageRender() => CustomRender.fromWidget(widget: (context, bu
201201
return child;
202202
},
203203
);
204-
return RawGestureDetector(
205-
key: context.key,
206-
child: widget,
207-
gestures: {
208-
MultipleTapGestureRecognizer: GestureRecognizerFactoryWithHandlers<MultipleTapGestureRecognizer>(
209-
() => MultipleTapGestureRecognizer(), (instance) {
210-
instance..onTap = () => context.parser.onImageTap?.call(
211-
_src(context.tree.element!.attributes.cast())!.split("base64,")[1].trim(),
212-
context,
213-
context.tree.element!.attributes.cast(),
214-
context.tree.element
204+
return Builder(
205+
builder: (buildContext) {
206+
return GestureDetector(
207+
key: context.key,
208+
child: widget,
209+
onTap: () {
210+
if (MultipleTapGestureDetector.of(buildContext) != null) {
211+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
212+
}
213+
context.parser.onImageTap?.call(
214+
_src(context.tree.element!.attributes.cast())!.split("base64,")[1].trim(),
215+
context,
216+
context.tree.element!.attributes.cast(),
217+
context.tree.element
218+
);
219+
},
215220
);
216-
},
217-
),
218-
},
221+
}
219222
);
220223
});
221224

@@ -235,16 +238,24 @@ CustomRender assetImageRender({
235238
return child;
236239
},
237240
);
238-
return RawGestureDetector(
239-
key: context.key,
240-
child: widget,
241-
gestures: {
242-
MultipleTapGestureRecognizer: GestureRecognizerFactoryWithHandlers<MultipleTapGestureRecognizer>(
243-
() => MultipleTapGestureRecognizer(), (instance) {
244-
instance..onTap = () => context.parser.onImageTap?.call(assetPath, context, context.tree.element!.attributes.cast(), context.tree.element);
245-
},
246-
),
247-
},
241+
return Builder(
242+
builder: (buildContext) {
243+
return GestureDetector(
244+
key: context.key,
245+
child: widget,
246+
onTap: () {
247+
if (MultipleTapGestureDetector.of(buildContext) != null) {
248+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
249+
}
250+
context.parser.onImageTap?.call(
251+
assetPath,
252+
context,
253+
context.tree.element!.attributes.cast(),
254+
context.tree.element
255+
);
256+
},
257+
);
258+
}
248259
);
249260
});
250261

@@ -321,16 +332,24 @@ CustomRender networkImageRender({
321332
}
322333
},
323334
);
324-
return RawGestureDetector(
325-
key: context.key,
326-
child: widget,
327-
gestures: {
328-
MultipleTapGestureRecognizer: GestureRecognizerFactoryWithHandlers<MultipleTapGestureRecognizer>(
329-
() => MultipleTapGestureRecognizer(), (instance) {
330-
instance..onTap = () => context.parser.onImageTap?.call(src, context, context.tree.element!.attributes.cast(), context.tree.element);
331-
},
332-
),
333-
},
335+
return Builder(
336+
builder: (buildContext) {
337+
return GestureDetector(
338+
key: context.key,
339+
child: widget,
340+
onTap: () {
341+
if (MultipleTapGestureDetector.of(buildContext) != null) {
342+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
343+
}
344+
context.parser.onImageTap?.call(
345+
src,
346+
context,
347+
context.tree.element!.attributes.cast(),
348+
context.tree.element
349+
);
350+
},
351+
);
352+
}
334353
);
335354
});
336355

lib/flutter_html.dart

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,18 @@
11
library flutter_html;
22

3-
//export image render api
4-
export 'package:flutter_html/image_render.dart';
5-
//export style api
6-
export 'package:flutter_html/style.dart';
7-
//export render context api
8-
export 'package:flutter_html/html_parser.dart';
9-
//export src for advanced custom render uses (e.g. casting context.tree)
10-
export 'package:flutter_html/src/layout_element.dart';
11-
export 'package:flutter_html/src/replaced_element.dart';
12-
export 'package:flutter_html/src/styled_element.dart';
13-
export 'package:flutter_html/src/interactable_element.dart';
14-
153
import 'package:flutter/material.dart';
164
import 'package:flutter_html/custom_render.dart';
175
import 'package:flutter/rendering.dart';
186
import 'package:flutter_html/html_parser.dart';
197
import 'package:flutter_html/src/html_elements.dart';
208
import 'package:flutter_html/style.dart';
219
import 'package:html/dom.dart' as dom;
22-
import 'package:webview_flutter/webview_flutter.dart';
2310

2411
//export render context api
2512
export 'package:flutter_html/html_parser.dart';
2613
//export render context api
2714
export 'package:flutter_html/html_parser.dart';
28-
//export image render api
29-
export 'package:flutter_html/image_render.dart';
3015
export 'package:flutter_html/custom_render.dart';
31-
//export image render api
32-
export 'package:flutter_html/image_render.dart';
3316
export 'package:flutter_html/src/anchor.dart';
3417
export 'package:flutter_html/src/anchor.dart';
3518
export 'package:flutter_html/src/interactable_element.dart';

packages/flutter_html_math/lib/flutter_html_math.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import 'package:flutter_math_fork/flutter_math.dart';
88
CustomRender mathRender({OnMathError? onMathError}) => CustomRender.fromWidget(widget: (context, buildChildren) {
99
String texStr = context.tree.element == null ? '' : parseMathRecursive(context.tree.element!, r'');
1010
return Container(
11-
width: MediaQuery.of(context.buildContext).size.width,
11+
width: context.parser.shrinkWrap ? null : MediaQuery.of(context.buildContext).size.width,
1212
child: Math.tex(
1313
texStr,
1414
mathStyle: MathStyle.display,

packages/flutter_html_svg/lib/flutter_html_svg.dart

Lines changed: 89 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,92 @@ import 'dart:convert';
44

55
import 'package:flutter/material.dart';
66
import 'package:flutter_html/flutter_html.dart';
7+
// ignore: implementation_imports
8+
import 'package:flutter_html/src/utils.dart';
79
import 'package:flutter_svg/flutter_svg.dart';
810

911
CustomRender svgTagRender() => CustomRender.fromWidget(widget: (context, buildChildren) {
10-
return SvgPicture.string(
11-
context.tree.element?.outerHtml ?? "",
12-
key: context.key,
13-
width: double.tryParse(context.tree.element?.attributes['width'] ?? ""),
14-
height: double.tryParse(context.tree.element?.attributes['width'] ?? ""),
12+
return Builder(
13+
builder: (buildContext) {
14+
return GestureDetector(
15+
key: context.key,
16+
child: SvgPicture.string(
17+
context.tree.element?.outerHtml ?? "",
18+
key: context.key,
19+
width: double.tryParse(context.tree.element?.attributes['width'] ?? ""),
20+
height: double.tryParse(context.tree.element?.attributes['width'] ?? ""),
21+
),
22+
onTap: () {
23+
if (MultipleTapGestureDetector.of(buildContext) != null) {
24+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
25+
}
26+
context.parser.onImageTap?.call(
27+
context.tree.element?.outerHtml ?? "",
28+
context,
29+
context.tree.element!.attributes.cast(),
30+
context.tree.element
31+
);
32+
},
33+
);
34+
}
1535
);
1636
});
1737

1838
CustomRender svgDataImageRender() => CustomRender.fromWidget(widget: (context, buildChildren) {
1939
final dataUri = _dataUriFormat.firstMatch(_src(context.tree.element?.attributes.cast() ?? <String, String>{})!);
2040
final data = dataUri?.namedGroup('data');
2141
if (data == null) return Container(height: 0, width: 0);
22-
if (dataUri?.namedGroup('encoding') == ';base64') {
23-
final decodedImage = base64.decode(data.trim());
24-
return SvgPicture.memory(
25-
decodedImage,
26-
width: _width(context.tree.element?.attributes.cast() ?? <String, String>{}),
27-
height: _height(context.tree.element?.attributes.cast() ?? <String, String>{}),
28-
);
29-
}
30-
return SvgPicture.string(Uri.decodeFull(data));
42+
return Builder(
43+
builder: (buildContext) {
44+
return GestureDetector(
45+
key: context.key,
46+
child: dataUri?.namedGroup('encoding') == ';base64' ? SvgPicture.memory(
47+
base64.decode(data.trim()),
48+
width: _width(context.tree.element?.attributes.cast() ?? <String, String>{}),
49+
height: _height(context.tree.element?.attributes.cast() ?? <String, String>{}),
50+
) : SvgPicture.string(Uri.decodeFull(data)),
51+
onTap: () {
52+
if (MultipleTapGestureDetector.of(buildContext) != null) {
53+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
54+
}
55+
context.parser.onImageTap?.call(
56+
Uri.decodeFull(data),
57+
context,
58+
context.tree.element!.attributes.cast(),
59+
context.tree.element
60+
);
61+
},
62+
);
63+
}
64+
);
3165
});
3266

3367
CustomRender svgNetworkImageRender() => CustomRender.fromWidget(widget: (context, buildChildren) {
3468
if (context.tree.element?.attributes["src"] == null) {
3569
return Container(height: 0, width: 0);
3670
}
37-
return SvgPicture.network(
38-
context.tree.element!.attributes["src"]!,
39-
width: _width(context.tree.element!.attributes.cast()),
40-
height: _height(context.tree.element!.attributes.cast()),
71+
return Builder(
72+
builder: (buildContext) {
73+
return GestureDetector(
74+
key: context.key,
75+
child: SvgPicture.network(
76+
context.tree.element!.attributes["src"]!,
77+
width: _width(context.tree.element!.attributes.cast()),
78+
height: _height(context.tree.element!.attributes.cast()),
79+
),
80+
onTap: () {
81+
if (MultipleTapGestureDetector.of(buildContext) != null) {
82+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
83+
}
84+
context.parser.onImageTap?.call(
85+
context.tree.element!.attributes["src"]!,
86+
context,
87+
context.tree.element!.attributes.cast(),
88+
context.tree.element
89+
);
90+
},
91+
);
92+
}
4193
);
4294
});
4395

@@ -46,7 +98,25 @@ CustomRender svgAssetImageRender() => CustomRender.fromWidget(widget: (context,
4698
return Container(height: 0, width: 0);
4799
}
48100
final assetPath = _src(context.tree.element!.attributes.cast())!.replaceFirst('asset:', '');
49-
return SvgPicture.asset(assetPath);
101+
return Builder(
102+
builder: (buildContext) {
103+
return GestureDetector(
104+
key: context.key,
105+
child: SvgPicture.asset(assetPath),
106+
onTap: () {
107+
if (MultipleTapGestureDetector.of(buildContext) != null) {
108+
MultipleTapGestureDetector.of(buildContext)!.onTap?.call();
109+
}
110+
context.parser.onImageTap?.call(
111+
assetPath,
112+
context,
113+
context.tree.element!.attributes.cast(),
114+
context.tree.element
115+
);
116+
},
117+
);
118+
}
119+
);
50120
});
51121

52122
CustomRenderMatcher svgTagMatcher() => (context) {

0 commit comments

Comments
 (0)