Flutter 如何在具有动态url的IOS中使用WebView?
我有一个动态html url('https://...../tokens,标题等/example.html')。我把cookie设置放在url中。这是我的webview课程,它在Android上运行得非常好。但在IOS上,只有加载小部件处于活动状态。Webview不工作。控制台上没有错误或警告。我还在info.plist中添加了以下代码:Flutter 如何在具有动态url的IOS中使用WebView?,flutter,flutter-ios,flutterwebviewplugin,Flutter,Flutter Ios,Flutterwebviewplugin,我有一个动态html url('https://...../tokens,标题等/example.html')。我把cookie设置放在url中。这是我的webview课程,它在Android上运行得非常好。但在IOS上,只有加载小部件处于活动状态。Webview不工作。控制台上没有错误或警告。我还在info.plist中添加了以下代码: <key>io.flutter.embedded_views_preview</key><true/> <key&g
<key>io.flutter.embedded_views_preview</key><true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
io.flatter.embedded\u视图\u预览
NSAppTransportSecurity
NSAllowsArbitraryLoads
NSAllowsArbilarLoadsInWebContent
我的webview小部件仍然无法工作。我尝试了很多webview插件,它们都不能解决我的问题。如果我使用任何其他url,它工作正常。一切都是最新的颤振医生。Xcode版本12.3。
这是使用inappwebview插件的代码
class MyWebView extends StatefulWidget {
final String title;
final String selectedUrl;
MyWebView({
@required this.title,
@required this.selectedUrl,
});
@override
_MyWebViewState createState() => _MyWebViewState();
}
class _MyWebViewState extends State<MyWebView> {
num position = 1;
String token;
String tenant;
String roleID;
String path;
/*final Completer<WebViewController> _controller =
Completer<WebViewController>();
*/
final flutterWebviewPlugin = new FlutterWebviewPlugin();
final Set<JavascriptChannel> jsChannels = [
JavascriptChannel(
name: 'Print',
onMessageReceived: (JavascriptMessage message) {
print(message.message);
}),
].toSet();
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _getTenant().then((v) {
setState(() {
this.tenant = v;
});
});
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _getToken().then((v) {
setState(() {
this.token = v;
});
});
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _getRoleId().then((v) {
setState(() {
this.roleID = v;
});
});
});
WidgetsBinding.instance.addPostFrameCallback((_) async {
await _getDefaultPath().then((v) {
setState(() {
this.path = v;
});
});
});
}
@override
Widget build(BuildContext context) {
print('url ->>> ' + widget.selectedUrl);
return new MaterialApp(
routes: {
"/": (_) => new WebviewScaffold(
headers: {
'tenant': this.tenant,
'ORA_BIPS_NQID': this.token,
'roles': this.roleID
},
url: widget.selectedUrl,
javascriptChannels: jsChannels,
appBar: new AppBar(
leading: IconButton(
icon: Icon(Icons.arrow_back, color: Colors.white),
onPressed: () => Navigator.of(context).pop(),
),
backgroundColor: Colors.grey,
title: new Text("Vispeahen"),
),
withZoom: true,
withLocalStorage: true,
hidden: true,
initialChild: Container(
color: Colors.white,
child: const Center(
child: CircularProgressIndicator(),
),
),
),
},
);
}
}
类MyWebView扩展StatefulWidget{
最后的字符串标题;
最终字符串selectedUrl;
MyWebView({
@需要这个标题,
@此选项为必填项。已选择此选项,
});
@凌驾
_MyWebViewState createState()=>\u MyWebViewState();
}
类_MyWebViewState扩展状态{
num position=1;
字符串标记;
串租户;
字符串roleID;
字符串路径;
/*最终完成器控制器=
完成符();
*/
最终FlatterWebViewPlugin=新的FlatterWebViewPlugin();
最终设置JS通道=[
JavascriptChannel(
名称:'打印',
onMessageReceived:(JavascriptMessage消息){
打印(message.message);
}),
].toSet();
@凌驾
void initState(){
super.initState();
WidgetsBinding.instance.addPostFrameCallback(())异步{
等待_getTenant()。然后((v){
设置状态(){
这是:v,;
});
});
});
WidgetsBinding.instance.addPostFrameCallback(())异步{
等待_getToken()。然后((v){
设置状态(){
this.token=v;
});
});
});
WidgetsBinding.instance.addPostFrameCallback(())异步{
等待_getRoleId()。然后((v){
设置状态(){
this.roleID=v;
});
});
});
WidgetsBinding.instance.addPostFrameCallback(())异步{
等待_getDefaultPath()。然后((v){
设置状态(){
this.path=v;
});
});
});
}
@凌驾
小部件构建(构建上下文){
打印('url->>'+小部件。选择url);
返回新材料PP(
路线:{
“/”:()=>新建WebviewScaffold(
标题:{
“租户”:this.tenant,
“ORA_BIPS_NQID”:这个.token,
“角色”:this.roleID
},
url:widget.selectedUrl,
JavaScriptChannel:JSChannel,
appBar:新的appBar(
领先:IconButton(
图标:图标(Icons.arrow\u back,颜色:Colors.white),
onPressed:()=>Navigator.of(context.pop(),
),
背景颜色:颜色。灰色,
标题:新文本(“Vispeahen”),
),
withZoom:true,
withLocalStorage:true,
隐藏:是的,
initialChild:容器(
颜色:颜色,白色,
孩子:康斯特中心(
子对象:CircularProgressIndicator(),
),
),
),
},
);
}
}
这是Flitter的WebView插件
class MyWebView extends StatefulWidget {
final String title;
final String selectedUrl;
MyWebView({
@required this.title,
@required this.selectedUrl,
});
@override
_MyWebViewState createState() => _MyWebViewState();
}
class _MyWebViewState extends State<MyWebView> {
num position = 1;
final Completer<WebViewController> _controller =
Completer<WebViewController>();
@override
void initState() {
super.initState();
WebView.platform = SurfaceAndroidWebView();
}
@override
Widget build(BuildContext context) {
print('url ->>> ' + widget.selectedUrl);
return Scaffold(
appBar: AppBar(
backgroundColor: Colors.grey,
title: Text(widget.title),
),
body: IndexedStack(
index: position,
children: <Widget>[
WebView(
initialUrl: widget.selectedUrl,
onPageStarted: (value) {
setState(() {
position = 1;
});
},
onPageFinished: (value) {
setState(() {
position = 0;
});
},
javascriptMode: JavascriptMode.unrestricted,
onWebViewCreated: (WebViewController webViewController) {
_controller.complete(webViewController);
},
navigationDelegate: (NavigationRequest nav) {
print(
'SAW REQ TO LOAD: ${nav.url}\nIN MAIN FRAME? ${nav.isForMainFrame}');
return NavigationDecision.navigate;
}),
Container(
child: Center(child: CircularProgressIndicator()),
),
],
));
}
}
类MyWebView扩展StatefulWidget{
最后的字符串标题;
最终字符串selectedUrl;
MyWebView({
@需要这个标题,
@此选项为必填项。已选择此选项,
});
@凌驾
_MyWebViewState createState()=>\u MyWebViewState();
}
类_MyWebViewState扩展状态{
num position=1;
最终完成器控制器=
完成符();
@凌驾
void initState(){
super.initState();
WebView.platform=SurfaceAndroidWebView();
}
@凌驾
小部件构建(构建上下文){
打印('url->>'+小部件。选择url);
返回脚手架(
appBar:appBar(
背景颜色:颜色。灰色,
标题:文本(widget.title),
),
正文:IndexedStack(
索引:位置,
儿童:[
网络视图(
initialUrl:widget.selectedUrl,
onPageStarted:(值){
设置状态(){
位置=1;
});
},
onPageFinished:(值){
设置状态(){
位置=0;
});
},
javascriptMode:javascriptMode.unrestricted,
onWebViewCreated:(WebViewController WebViewController){
_控制器。完成(webViewController);
},
导航委托:(导航请求导航){
印刷品(
'要加载的SAW请求:${nav.url}\n在主框架中?${nav.isForMainFrame}';
返回NavigationDecision.navigate;
}),
容器(
子对象:中心(子对象:CircularProgressIndicator()),
),
],
));
}
}
它给了我同样的结果