Flutter使用URL Launcher插件点击绑定directory.phone的号码无法唤起拨号盘
Flutter URL Launcher 动态拼接号码无法唤起拨号盘解决方案
核心原因:动态获取的directory.phone变量大概率包含非数字的冗余字符(空格、横线、换行符、不可见转义字符等),硬编码时无额外字符所以可以正常唤起,打印时非可见字符不会输出,所以无法从日志中发现差异。
具体解决步骤
- 清洗号码,移除所有非数字内容
- 使用Uri对象生成拨号链接,避免直接字符串拼接带来的编码异常问题
- 搭配系统能力判断逻辑调用唤起方法,同时补全平台权限配置
修正后代码
InkWell( onTap: () async { // 过滤所有非数字字符,清洗号码 String cleanPhone = directory.phone.replaceAll(RegExp(r'[^0-9]'), ''); // 用Uri规范生成拨号链接 Uri phoneUri = Uri(scheme: 'tel', path: cleanPhone); // 先判断当前设备是否支持唤起拨号盘 if (await canLaunchUrl(phoneUri)) { await launchUrl(phoneUri); } print(directory.phone); }, child: Text( directory.phone, overflow: TextOverflow.ellipsis, style: TextStyle( fontSize: 12, color: Theme.of(context) .textTheme .bodyText1 .color .withAlpha(150), ), ) )
必要平台配置
Android端(适配Android 11+)
在AndroidManifest.xml的manifest标签下添加查询配置:
<queries> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent> </queries>
iOS端
在Info.plist中添加scheme白名单配置:
<key>LSApplicationQueriesSchemes</key> <array> <string>tel</string> </array>
内容的提问来源于stack exchange,提问作者bit_punk
相关产品推荐
相关产品推荐

