- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一名 Web 开发人员,也是 Flutter 的初学者。我通过观看一些教程创建了一个 Flutter Web View 应用程序,它在 iOS 和 Android 上运行良好。但是,当我单击“0123456789”、mailto:“abc@gmail.com”、WhatsApp 链接 ( https://wa.me/9712345678 ) 时,它会转到未找到页面。我想为这些条件打开一个外部应用程序。如何快速处理此任务以支持 iOS 和 Android?我使用 flutter webview 插件来启动一个 url,例如:我可以知道在哪里添加以下代码才能工作吗?
if (request.url.contains("mailto:")) {
_launchURL(request.url);
return NavigationDecision.prevent;
} else if (request.url.contains("tel:")) {
_launchURL(request.url);
return NavigationDecision.prevent;
} else if (request.url.contains("sms:")) {
_launchURL(request.url);
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
import 'package:flutter_offline/flutter_offline.dart';
import 'package:location/location.dart';
import 'package:url_launcher/url_launcher.dart';
_launchURL(url) async {
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not launch $url';
}
}
void main() => runApp(MyApp());
Color btnColor = Color(0xff03a9f3);
Color bgColor = Color(0xffe9f4fc);
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Qavenue',
home: OfflineBuilder(
connectivityBuilder: (
BuildContext context,
ConnectivityResult connectivity,
Widget child,
) {
final bool connected = connectivity != ConnectivityResult.none;
return Container(
child: connected
? MyHomePage()
: Center(
child: Image.asset(
'assets/offline_blue.gif',
fit: BoxFit.cover,
width: 200.0,
),
),
color: bgColor,
);
},
child: MyHomePage(),
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
String url = "https://example.xyz/";
final flutterWebviewPlugin = new FlutterWebviewPlugin();
StreamSubscription<WebViewStateChanged>
_onchanged; // here we checked the url state if it loaded or start Load or abort Load
@override
void initState() {
super.initState();
_onchanged =
flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged state) {
if (mounted) {
if (state.type == WebViewState.finishLoad) {
// if the full website page loaded`
print("loaded");
} else if (state.type == WebViewState.abortLoad) {
// if there is a problem with loading the url
print("there is a problem");
} else if (state.type == WebViewState.startLoad) {
// if the url started loading
print("start loading");
}
}
});
}
@override
void dispose() {
super.dispose();
flutterWebviewPlugin
.dispose(); // disposing the webview widget to avoid any leaks
}
@override
Widget build(BuildContext context) {
return SafeArea(
child: WillPopScope(
onWillPop: () {
flutterWebviewPlugin.canGoBack().then((value) {
if (value) {
flutterWebviewPlugin.goBack();
} else {
exit(0);
}
});
},
child: WebviewScaffold(
url: url,
withJavascript: true,
withZoom: false,
hidden: true,
geolocationEnabled: true,
initialChild: Container(
color: Colors.white,
child: Center(
child: Image.asset('assets/icon/images/logo1.jpg'),
),
),
)),
);
}
}
最佳答案
解决这个问题的一种方法是也导入 url_launcher_string.dart。当您指定链接时,您将需要它。
import 'package:url_launcher/url_launcher_string.dart';
运行 flutter pub get,然后在您的主应用程序 dart(例如 main.dart)中告诉它如何处理 url。
launchURL(url) async {
if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
throw 'Could not launch $url';
}
}
上面的代码部分可以在任何地方。你也可以把它放在另一个 Dart 里并导入它。如果你把它放在你的 webview 小部件类中而不是像你那样放在任何地方当然会更好,除非你也需要在其他地方使用它。之后,您在 webview 小部件类中指定如何处理 url。例如在:
class WebViewApp extends StatefulWidget {
}
代码的“NavigationDecision”部分。例如:
NavigationDecision _interceptNavigation(NavigationRequest request) {
if (request.url.contains("mailto:")) {
launchUrlString('mailto:specify email address here');
return NavigationDecision.prevent;
} else if (request.url.contains("tel:")) {
launchUrlString('tel:specify telephone number here');
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
}
在上面的代码部分中,您定义了“请求”,然后告诉它如何处理每个请求。因此,如果您定义“NavigationRequest 请求”,那么您将告诉它如何处理每个请求。如果您定义“NavigationRequest name”,那么您指定要如何处理该名称。例如
NavigationDecision _interceptNavigation(NavigationRequest name) {
if (name.url.contains("mailto:")) {
launchUrlString('mailto:specify email address here');
return NavigationDecision.prevent;
} else if (name.url.contains("tel:")) {
launchUrlString('tel:specify telephone number here');
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
}
当然,您可以通过编辑 name.url.contains 行并添加更多 else if decisions 来添加更多 url。例如whatsapp、电报、viber 等。就像您对短信所做的那样。
不要忘记在需要时调用您的导航决策代码。在你告诉你的 webview 什么是初始 url 的覆盖内,你用你设置的名称调用你的导航决定。例如:
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: WebView(
initialUrl: 'https:url', // Webview initial url here
javascriptMode: JavascriptMode.unrestricted, // Enable use of javascript
navigationDelegate: _interceptNavigation, // Call for your navigation decision
),
)
);
}
我们将其命名为“_interceptNavigation”,这就是我们的要求。这就是对那部分代码的理解。希望对您有所帮助。我也为初学者一步一步地解释了它。
关于javascript - 无法在 flutter webview 中打开 tel、mailto、whatsapp 链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66938475/
知道两者都用作移动浏览器的提示,我找不到关于使用 之间区别的真实文档。和 .所以 有什么区别? 哪个更好用? 如果相同,为什么要重复? MDN文档建议使用该类型。但在解释上仍不清楚。 最佳答案 如
Gradle脚本 copy { from 'src/com/comcast/telescope/Telescope.java' into 'dist/com/comcast/teles
我在日志中收到此错误? 虽然我在模拟器上运行它,但这在测试阶段会重要吗? canOpenURL: failed for URL: "tel://0478733797" - error: "This a
这个问题在这里已经有了答案: Wordpress change url from http:// to tel: (2 个答案) 关闭 4 年前。
我尝试在软键盘告诉模式下将事件绑定(bind)到已完成的操作。但我无法捕捉到任何事件。我尝试使用 keyup/keydown、blur 和 change 事件。iPhone 和 android 没有任
我现在在我的网站上列出了一个电话号码,它目前链接到“tel:myphonenumber”...除非该网站已加载到移动设备上,否则如何删除此 href? 最佳答案 这里已经回答过了 How can I
我有一张使用 Fusion Table 图层来提供联系信息的 map 。我希望添加此功能,以便可以从智能手机调用联系信息。 但 FT 似乎不喜欢这样,因为每当我将其加载到我的服务器上时,它都会以 j
关于 this网站,我在显示手机号码的右上角有一个指向移动设备电话号码的链接。在台式机上,当点击此链接时,Chrome 会忽略该链接,但 firefox 和 internet explorer 会重定
我想插入这个号码“*3*123#”作为电话号码。但是从 Android 设备点击链接后,# 符号被省略,要调用的号码是 *3*123。我也尝试了所有这些代码,但没有一个可以完成这项工作。 最佳答案
我需要为移动设备构建一个网页。 只有一件事我还没有弄清楚:如何通过点击图片来触发电话调用。 如果我给出 , 它会工作,但如果从非移动浏览器中单击它,将显示“找不到页面”,因为电话号码自然不是现有页面
即使 tel 设置为可选,Joi 仍返回以下错误。我们如何解决这个问题? 谢谢。 Error: Joi Failed: ValidationError: child "tel" fails becau
我正在尝试让我的 android webview 应用程序打开 tel: 到手机的链接。每次我打开电话链接时,它都会很好地打开电话。但是,一旦我完成通话并返回应用程序,它就会出现在一个页面上,上面写着
如果我使用 tel: 我应该像这样写国际电话代码。 61709 到目前为止,一切都很好,但我找不到有关如何以“国际”方式编写手机号码的信息,如果有的话。 最佳答案 调用您所在国家/地区的号码时,您仍需
1、双击运行tel.xls.vbs即可消灭Trojan.Win32.Patched.v病毒。 2、本专杀使用VBS脚本编写,执行效率高,不过缺乏智能性,我也不愿去添加那些IF判断语句来进行智能判断
我有一些显示电话号码的简单代码,用户应该能够点击它并调用电话: Telefon 123 我想要经典的黑色字体而不是蓝色超链接,所以我在我的 CSS 文件中这样写: a[href^=
为了使网站对移动设备友好,我想添加 和 但我必须像使用 JSF 我们如何使用 JSF 生成 html 输入类型? 我也在使用primefaces,它们有类似的功能吗? 最佳答案 如果你使用 Pr
我的电子邮件中有一个带有 链接的按钮,因此移动用户只需单击该按钮即可调用我的号码。 有没有办法跟踪此按钮的点击次数?例如链接到将进行跟踪的 php 文件;但我不知道如何重定向或将什么返回到移动设备。
我们以搜索结果格式显示列表,每页10个。对于每个列表,当显示在手机上时,我们都会提供一个跟踪的电话号码。 我们试图确定的是,当用户单击跟踪的号码以呼叫该位置时,这是否会归因于退回/退出,或者Goo
我正在使用 Formik 来处理 ReactJs 应用程序中的表单,我想使用 React-intl-tel-input 来处理电话号码,但是我无法将 handleChange、handleBlur 和
"> CALL 我需要将数据库中的电话号码添加到上面的 anchor 标记中。我怎么做? 从评论中编辑: $sql_m="select * FROM b2b_mec_tbl where b2
我是一名优秀的程序员,十分优秀!