From ed46530e4446a5c6180241226b537d55e52545fd Mon Sep 17 00:00:00 2001 From: Divyanshu Bhargava Date: Fri, 8 Sep 2023 14:44:36 +0400 Subject: [PATCH] Add tap gesture recognizer to the Mirai text Span --- .../assets/json/text_example.json | 9 ++++ examples/mirai_gallery/pubspec.lock | 4 +- .../src/parsers/mirai_text/mirai_text.dart | 1 + .../mirai_text/mirai_text.freezed.dart | 42 +++++++++++++++---- .../src/parsers/mirai_text/mirai_text.g.dart | 2 + .../parsers/mirai_text/mirai_text_parser.dart | 13 ++++-- 6 files changed, 58 insertions(+), 13 deletions(-) diff --git a/examples/mirai_gallery/assets/json/text_example.json b/examples/mirai_gallery/assets/json/text_example.json index 6202369a..35f8c3f4 100644 --- a/examples/mirai_gallery/assets/json/text_example.json +++ b/examples/mirai_gallery/assets/json/text_example.json @@ -53,6 +53,15 @@ "style": { "fontWeight": "w800", "color": "#6750A4" + }, + "onTap": { + "actionType": "navigate", + "navigationStyle": "push", + "navigationType": "screen", + "widgetJson": { + "type": "exampleScreen", + "assetPath": "assets/json/web_view_example.json" + } } } ] diff --git a/examples/mirai_gallery/pubspec.lock b/examples/mirai_gallery/pubspec.lock index 0c6d7274..48a34161 100644 --- a/examples/mirai_gallery/pubspec.lock +++ b/examples/mirai_gallery/pubspec.lock @@ -626,10 +626,10 @@ packages: dependency: transitive description: name: webview_flutter_platform_interface - sha256: "9d32a63a5ee111b37482cb3eac3379b9f0992afd27a52ee30279dbf06f41918b" + sha256: "6d9213c65f1060116757a7c473247c60f3f7f332cac33dc417c9e362a9a13e4f" url: "https://pub.dev" source: hosted - version: "2.5.1" + version: "2.6.0" webview_flutter_wkwebview: dependency: transitive description: diff --git a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.dart b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.dart index 4f7cbfa7..5a766c40 100644 --- a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.dart +++ b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.dart @@ -33,6 +33,7 @@ class MiraiTextSpan with _$MiraiTextSpan { const factory MiraiTextSpan({ String? data, MiraiTextStyle? style, + Map? onTap, }) = _MiraiTextSpan; factory MiraiTextSpan.fromJson(Map json) => diff --git a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.freezed.dart b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.freezed.dart index e56b678d..9aa2bd76 100644 --- a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.freezed.dart +++ b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.freezed.dart @@ -427,6 +427,7 @@ MiraiTextSpan _$MiraiTextSpanFromJson(Map json) { mixin _$MiraiTextSpan { String? get data => throw _privateConstructorUsedError; MiraiTextStyle? get style => throw _privateConstructorUsedError; + Map? get onTap => throw _privateConstructorUsedError; Map toJson() => throw _privateConstructorUsedError; @JsonKey(ignore: true) @@ -440,7 +441,7 @@ abstract class $MiraiTextSpanCopyWith<$Res> { MiraiTextSpan value, $Res Function(MiraiTextSpan) then) = _$MiraiTextSpanCopyWithImpl<$Res, MiraiTextSpan>; @useResult - $Res call({String? data, MiraiTextStyle? style}); + $Res call({String? data, MiraiTextStyle? style, Map? onTap}); $MiraiTextStyleCopyWith<$Res>? get style; } @@ -460,6 +461,7 @@ class _$MiraiTextSpanCopyWithImpl<$Res, $Val extends MiraiTextSpan> $Res call({ Object? data = freezed, Object? style = freezed, + Object? onTap = freezed, }) { return _then(_value.copyWith( data: freezed == data @@ -470,6 +472,10 @@ class _$MiraiTextSpanCopyWithImpl<$Res, $Val extends MiraiTextSpan> ? _value.style : style // ignore: cast_nullable_to_non_nullable as MiraiTextStyle?, + onTap: freezed == onTap + ? _value.onTap + : onTap // ignore: cast_nullable_to_non_nullable + as Map?, ) as $Val); } @@ -494,7 +500,7 @@ abstract class _$$_MiraiTextSpanCopyWith<$Res> __$$_MiraiTextSpanCopyWithImpl<$Res>; @override @useResult - $Res call({String? data, MiraiTextStyle? style}); + $Res call({String? data, MiraiTextStyle? style, Map? onTap}); @override $MiraiTextStyleCopyWith<$Res>? get style; @@ -513,6 +519,7 @@ class __$$_MiraiTextSpanCopyWithImpl<$Res> $Res call({ Object? data = freezed, Object? style = freezed, + Object? onTap = freezed, }) { return _then(_$_MiraiTextSpan( data: freezed == data @@ -523,6 +530,10 @@ class __$$_MiraiTextSpanCopyWithImpl<$Res> ? _value.style : style // ignore: cast_nullable_to_non_nullable as MiraiTextStyle?, + onTap: freezed == onTap + ? _value._onTap + : onTap // ignore: cast_nullable_to_non_nullable + as Map?, )); } } @@ -530,7 +541,9 @@ class __$$_MiraiTextSpanCopyWithImpl<$Res> /// @nodoc @JsonSerializable() class _$_MiraiTextSpan implements _MiraiTextSpan { - const _$_MiraiTextSpan({this.data, this.style}); + const _$_MiraiTextSpan( + {this.data, this.style, final Map? onTap}) + : _onTap = onTap; factory _$_MiraiTextSpan.fromJson(Map json) => _$$_MiraiTextSpanFromJson(json); @@ -539,10 +552,19 @@ class _$_MiraiTextSpan implements _MiraiTextSpan { final String? data; @override final MiraiTextStyle? style; + final Map? _onTap; + @override + Map? get onTap { + final value = _onTap; + if (value == null) return null; + if (_onTap is EqualUnmodifiableMapView) return _onTap; + // ignore: implicit_dynamic_type + return EqualUnmodifiableMapView(value); + } @override String toString() { - return 'MiraiTextSpan(data: $data, style: $style)'; + return 'MiraiTextSpan(data: $data, style: $style, onTap: $onTap)'; } @override @@ -551,12 +573,14 @@ class _$_MiraiTextSpan implements _MiraiTextSpan { (other.runtimeType == runtimeType && other is _$_MiraiTextSpan && (identical(other.data, data) || other.data == data) && - (identical(other.style, style) || other.style == style)); + (identical(other.style, style) || other.style == style) && + const DeepCollectionEquality().equals(other._onTap, _onTap)); } @JsonKey(ignore: true) @override - int get hashCode => Object.hash(runtimeType, data, style); + int get hashCode => Object.hash( + runtimeType, data, style, const DeepCollectionEquality().hash(_onTap)); @JsonKey(ignore: true) @override @@ -574,7 +598,9 @@ class _$_MiraiTextSpan implements _MiraiTextSpan { abstract class _MiraiTextSpan implements MiraiTextSpan { const factory _MiraiTextSpan( - {final String? data, final MiraiTextStyle? style}) = _$_MiraiTextSpan; + {final String? data, + final MiraiTextStyle? style, + final Map? onTap}) = _$_MiraiTextSpan; factory _MiraiTextSpan.fromJson(Map json) = _$_MiraiTextSpan.fromJson; @@ -584,6 +610,8 @@ abstract class _MiraiTextSpan implements MiraiTextSpan { @override MiraiTextStyle? get style; @override + Map? get onTap; + @override @JsonKey(ignore: true) _$$_MiraiTextSpanCopyWith<_$_MiraiTextSpan> get copyWith => throw _privateConstructorUsedError; diff --git a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.g.dart b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.g.dart index 2bd5d55a..3e228c0d 100644 --- a/packages/mirai/lib/src/parsers/mirai_text/mirai_text.g.dart +++ b/packages/mirai/lib/src/parsers/mirai_text/mirai_text.g.dart @@ -76,10 +76,12 @@ _$_MiraiTextSpan _$$_MiraiTextSpanFromJson(Map json) => style: json['style'] == null ? null : MiraiTextStyle.fromJson(json['style'] as Map), + onTap: json['onTap'] as Map?, ); Map _$$_MiraiTextSpanToJson(_$_MiraiTextSpan instance) => { 'data': instance.data, 'style': instance.style, + 'onTap': instance.onTap, }; diff --git a/packages/mirai/lib/src/parsers/mirai_text/mirai_text_parser.dart b/packages/mirai/lib/src/parsers/mirai_text/mirai_text_parser.dart index 575414ae..615c9709 100644 --- a/packages/mirai/lib/src/parsers/mirai_text/mirai_text_parser.dart +++ b/packages/mirai/lib/src/parsers/mirai_text/mirai_text_parser.dart @@ -1,3 +1,4 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:mirai/src/framework/framework.dart'; import 'package:mirai/src/parsers/mirai_text/mirai_text.dart'; @@ -20,10 +21,14 @@ class MiraiTextParser extends MiraiParser { TextSpan( text: model.data, children: model.children - .map((child) => TextSpan( - text: child.data, - style: child.style?.parse, - )) + .map( + (child) => TextSpan( + text: child.data, + style: child.style?.parse, + recognizer: TapGestureRecognizer() + ..onTap = () => Mirai.onCallFromJson(child.onTap, context), + ), + ) .toList(), ), style: model.style?.parse,