如何在setState flutter上更新Webview的URL?

时间:2019-05-18 15:08:30

标签: dart flutter

我需要用setState更新Webview的URL。该怎么做?

我在构造函数上设置的初始url已成功加载。但是,当我尝试通过onTap方法通过抽屉菜单加载新的菜单时,该按钮将不起作用。

...
class _MyWebState extends State<MyWeb> {
  Completer<WebViewController> _controller = Completer<WebViewController>();
  final Set<String> _favorites = Set<String>();
  String url;
  Widget web;

  _MyWebState() {
    web = WebView(
      initialUrl: 'https://my.flazhost.com',
      onWebViewCreated: (WebViewController webViewController) {
        _controller.complete(webViewController);
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('MyWeb'),
        actions: <Widget>[
          NavigationControls(_controller.future),
          Menu(_controller.future, () => _favorites),
        ],
      ),
      body: web,
      drawer: Drawer(
        child: ListView(
          children: <Widget>[
            ListTile(
              leading: FlutterLogo(
                size: 20,
              ),
              title: Text('Web AlQudwah'),
              onTap: () {
                setState(() {
                  web = WebView(
                    initialUrl: 'https://flazhost.com',
                    onWebViewCreated: (WebViewController webViewController) {
                      _controller.complete(webViewController);
                    },
                  );
                  Navigator.pop(context);
                });
              },
            ),
          ],
        ),
      ),
      floatingActionButton: _bookmarkButton(),
    );
  }
}
...

如何更新Webview的url onTap方法?请帮忙吗?

1 个答案:

答案 0 :(得分:0)

我在颤抖的webview中挣扎了很长时间,但我对此仍然不太满意...

但是关键是从Web视图的onWebViewCreated方法获得的WebController实例。初始化的WebViewController的实例具有一个名为loadUrl('your_new_url')

的方法。

因此您可以在onTap处理程序中调用以下命令:

onTap: () { 
   _controller.loadUrl('your_new_url');
}

在扑朔迷离地使用WebView时,在使用setState时遇到了问题,因为它将触发整个页面的重建,包括重新初始化的Webview以及当然会重新加载页面...

但是大多数情况下这不是期望的结果,因此,如果您想控制Webview(Wheater将更改为url,返回浏览器历史记录或执行JavaScript),则应通过从onWebViewCreated方法初始化的WebController处理它

以下是WebViewController类最常用的方法:

_controller.currentUrl() // Gets current url from WebView
_controller.loadUrl('your_new_url'); // Loads new url
_controller.evaluateJavascript('your js code as a string') // Execute JS over WebView console
_controller.goBack() // Goes one step back in browser history
_controller.goForward() // Goes one step forwards in browser history
_controller.clearCache() // Clears cache of WebView

这确实令人困惑并且记录不清(特别是对于像我这样的初学者),所以我希望Flutter团队能够为我们提供更多详细的信息和教程