Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何在具有动态url的IOS中使用WebView?_Flutter_Flutter Ios_Flutterwebviewplugin - Fatal编程技术网

Flutter 如何在具有动态url的IOS中使用WebView?

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

我有一个动态html url('https://...../tokens,标题等/example.html')。我把cookie设置放在url中。这是我的webview课程,它在Android上运行得非常好。但在IOS上,只有加载小部件处于活动状态。Webview不工作。控制台上没有错误或警告。我还在info.plist中添加了以下代码:

<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()),
),
],
));
}
}
它给了我同样的结果