@@ -18,6 +18,7 @@ import '../utils/colors.dart';
1818import '../utils/edge_insets.dart' ;
1919import '../utils/gradient.dart' ;
2020import '../utils/images.dart' ;
21+ import '../utils/launch_url.dart' ;
2122import 'create_control.dart' ;
2223import 'error.dart' ;
2324
@@ -45,6 +46,8 @@ class ContainerControl extends StatelessWidget {
4546 children.where ((c) => c.name == "content" && c.isVisible);
4647 bool ink = control.attrBool ("ink" , false )! ;
4748 bool onClick = control.attrBool ("onclick" , false )! ;
49+ String url = control.attrString ("url" , "" )! ;
50+ String ? urlTarget = control.attrString ("urlTarget" );
4851 bool onLongPress = control.attrBool ("onLongPress" , false )! ;
4952 bool onHover = control.attrBool ("onHover" , false )! ;
5053 bool disabled = control.isDisabled || parentDisabled;
@@ -126,26 +129,33 @@ class ContainerControl extends StatelessWidget {
126129
127130 Widget ? result;
128131
129- if ((onClick || onLongPress || onHover) && ink && ! disabled) {
132+ if ((onClick || url != "" || onLongPress || onHover) &&
133+ ink &&
134+ ! disabled) {
130135 var ink = Ink (
131136 decoration: boxDecor,
132137 child: InkWell (
133138 // Dummy callback to enable widget
134139 // see https://github.com/flutter/flutter/issues/50116#issuecomment-582047374
135140 // and https://github.com/flutter/flutter/blob/eed80afe2c641fb14b82a22279d2d78c19661787/packages/flutter/lib/src/material/ink_well.dart#L1125-L1129
136141 onTap: onHover ? () {} : null ,
137- onTapDown: onClick
142+ onTapDown: onClick || url != ""
138143 ? (details) {
139144 debugPrint ("Container ${control .id } clicked!" );
140- server.sendPageEvent (
141- eventTarget: control.id,
142- eventName: "click" ,
143- eventData: json.encode (ContainerTapEvent (
144- localX: details.localPosition.dx,
145- localY: details.localPosition.dy,
146- globalX: details.globalPosition.dx,
147- globalY: details.globalPosition.dy)
148- .toJson ()));
145+ if (url != "" ) {
146+ openWebBrowser (url, webWindowName: urlTarget);
147+ }
148+ if (onClick) {
149+ server.sendPageEvent (
150+ eventTarget: control.id,
151+ eventName: "click" ,
152+ eventData: json.encode (ContainerTapEvent (
153+ localX: details.localPosition.dx,
154+ localY: details.localPosition.dy,
155+ globalX: details.globalPosition.dx,
156+ globalY: details.globalPosition.dy)
157+ .toJson ()));
158+ }
149159 }
150160 : null ,
151161 onLongPress: onLongPress
@@ -230,9 +240,11 @@ class ContainerControl extends StatelessWidget {
230240 : null ,
231241 child: child);
232242
233- if ((onClick || onLongPress || onHover) && ! disabled) {
243+ if ((onClick || onLongPress || onHover || url != "" ) && ! disabled) {
234244 result = MouseRegion (
235- cursor: onClick ? SystemMouseCursors .click : MouseCursor .defer,
245+ cursor: onClick || url != ""
246+ ? SystemMouseCursors .click
247+ : MouseCursor .defer,
236248 onEnter: onHover
237249 ? (value) {
238250 debugPrint (
@@ -254,18 +266,23 @@ class ContainerControl extends StatelessWidget {
254266 }
255267 : null ,
256268 child: GestureDetector (
257- onTapDown: onClick
269+ onTapDown: onClick || url != ""
258270 ? (details) {
259271 debugPrint ("Container ${control .id } clicked!" );
260- server.sendPageEvent (
261- eventTarget: control.id,
262- eventName: "click" ,
263- eventData: json.encode (ContainerTapEvent (
264- localX: details.localPosition.dx,
265- localY: details.localPosition.dy,
266- globalX: details.globalPosition.dx,
267- globalY: details.globalPosition.dy)
268- .toJson ()));
272+ if (url != "" ) {
273+ openWebBrowser (url, webWindowName: urlTarget);
274+ }
275+ if (onClick) {
276+ server.sendPageEvent (
277+ eventTarget: control.id,
278+ eventName: "click" ,
279+ eventData: json.encode (ContainerTapEvent (
280+ localX: details.localPosition.dx,
281+ localY: details.localPosition.dy,
282+ globalX: details.globalPosition.dx,
283+ globalY: details.globalPosition.dy)
284+ .toJson ()));
285+ }
269286 }
270287 : null ,
271288 onLongPress: onLongPress
0 commit comments