flutter - 为什么 TapGestureRecognizer 在 ios 上不起作用?
问题描述
我正在尝试在我的应用程序中创建一个超链接,它在 android 上运行良好,但是当我在 IOS 上对其进行测试时,它会抛出附加的错误。
我的代码:
TextSpan(
style: TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
),
text: 'Hyperlink',
recognizer: TapGestureRecognizer()
..onTap = () async {
var url =
"https://www.flutter.dev/";
if (await canLaunch(url)) {
await launch(url);
} else {
throw "Cannot load Url";
}
}),
错误:
======== Exception caught by scheduler library =====================================================
The following RangeError was thrown during a scheduler callback:
RangeError (index): Invalid value: Valid value range is empty: 0
When the exception was thrown, this was the stack:
#0 List.[] (dart:core-patch/growable_array.dart:177:60)
#1 List.elementAt (dart:core-patch/growable_array.dart:386:16)
#2 RenderParagraph.assembleSemanticsNode (package:flutter/src/rendering/paragraph.dart:921:50)
#3 _SwitchableSemanticsFragment.compileChildren (package:flutter/src/rendering/object.dart:3717:13)
#4 _SwitchableSemanticsFragment.compileChildren (package:flutter/src/rendering/object.dart:3709:16)
...
====================================================================================================
根据要求,这是整个片段。我正在尝试实现一个 Listtile,它在按下时会打开一个可滚动的对话框。Únfortunately this error 当按下 Listtile 时发生
ListTile(
dense: true,
leading: Icon(
Icons.help,
color: Colors.black,
),
title: Text("contact"),
trailing: Icon(Icons.keyboard_arrow_right),
onTap: () {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
elevation: 20,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15.0),
),
content: Container(
width: double.maxFinite,
height: 130,
child: ListView(children: <Widget>[
RichText(
text: TextSpan(children: [
TextSpan(
text: 'Feedback:',
style: TextStyle(color: Colors.black)),
TextSpan(
text: "\n",
style: TextStyle(color: Colors.black)),
WidgetSpan(
child: Icon(
Icons.email,
size: 15,
)),
TextSpan(
text:
' John.Doe@email.com' + "\n",
style: TextStyle(color: Colors.black)),
TextSpan(
text: "\n",
style: TextStyle(color: Colors.black)),
TextSpan(
text: 'Updates:',
style: TextStyle(color: Colors.black)),
TextSpan(
text: "\n",
style: TextStyle(color: Colors.black)),
WidgetSpan(
child: Icon(
Icons.link,
size: 15,
)),
TextSpan(
text: ' ',
style: TextStyle(color: Colors.black)),
TextSpan(
style: TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
),
text: 'Instagram' + "\n",
recognizer: TapGestureRecognizer()
..onTap = () async {
var url =
"https://www.instagram.com/";
if (await canLaunch(url)) {
await launch(url);
} else {
throw "Cannot load Url";
}
}),
TextSpan(
text: "\n",
style: TextStyle(color: Colors.black)),
TextSpan(
text: 'Support:',
style: TextStyle(color: Colors.black)),
TextSpan(
text: "\n",
style: TextStyle(color: Colors.black)),
WidgetSpan(
child: Icon(
Icons.payment,
size: 15,
)),
TextSpan(
text: ' ',
style: TextStyle(color: Colors.black)),
TextSpan(
style: TextStyle(
color: Colors.blue,
decoration: TextDecoration.underline,
),
text: 'Paypal',
recognizer: TapGestureRecognizer()
..onTap = () async {
var url =
"https://www.paypal.me/";
if (await canLaunch(url)) {
await launch(url);
} else {
throw "Cannot load Url";
}
}),
]))
]),
),
);
});
},
),
这个片段有什么问题,为什么它可以在 android 上运行,但不能在 ios 上运行?
解决方案
这是一个颤振错误:https ://github.com/flutter/flutter/issues/51936
你可以在这里看到问题:https ://github.com/flutter/flutter/issues/70159
我在我的一个应用程序中使用此代码:
RichText(
textAlign: TextAlign.left,
text: TextSpan(
text: 'i accept',
children: <TextSpan>[
TextSpan(
recognizer: TapGestureRecognizer()
..onTap = () {
Navigator.pushNamed(context, 'terms');
},
text: 'Terms & conditions'),
],
),
)
我正在使用 Flutter 1.22.2,通道稳定,Dart 2.10.2
推荐阅读
- c++ - 钻石问题| 不调用祖父类的参数化构造函数
- amazon-web-services - 将私有 API GW api 列入白名单,可从另一个账户的 VPC 访问
- docker - Dockerfile 中的多个 RUN 条目和只有一个 RUN 条目有什么区别?
- terraform - 如何使用 Terraform 将密钥加载到 IBM KeyProtect
- puppet - 在课堂上,这段代码设置了什么?这是什么 is_a(arg1,arg2)?
- regex - 正则表达式。从列表中选择第二个值
- c# - 解析作为 exe C# 的输入参数提供的 json 字符串
- android - Pepper 取消运行动画
- xamarin.forms - Xamarin Forms 将产品与用户帐户连接起来
- android - 小部件仅在 2 次安装或重新启动后才有效