flutter webview加载时显示进度

最近在学习flutter,在webview加载页面时,如果网速不好的话,就会一直白屏,用户看到这个场景可能会比较迷惑,因此我们得加个进度条:

class _BlogState extends State<Blog> {
  final Completer<WebViewController> _controller =
      Completer<WebViewController>();
  bool isLoading = true;  // 设置状态

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(homeTitle),
        actions: <Widget>[
          BlogMenu(_controller.future),
        ],
      ),
      body: Stack(
        children: [
          WebView(
            initialUrl: homePage,
            javascriptMode: JavascriptMode.unrestricted,
            onWebViewCreated: (WebViewController webViewController) {
              _controller.complete(webViewController);
            },
            navigationDelegate: (NavigationRequest request) {
              var url = request.url;
              print("visit $url");
              setState(() {
                isLoading = true; // 开始访问页面,更新状态
              });

              return NavigationDecision.navigate;
            },
            onPageFinished: (String url) {
              setState(() {
                isLoading = false; // 页面加载完成,更新状态
              });
            },
          ),
          isLoading
              ? Container(
                  child: Center(
                    child: CircularProgressIndicator(),
                  ),
                )
              : Container(),
        ],
      ),
      floatingActionButton: getFloatingButton(),
    );
  }

我把 WebView 放在一个 StatefulWidget 里,通过一个 bool isLoading 来指示当前是否正在加载页面,当开始访问链接时, 将 isLoading 设置为 true,访问完成时,设置为 false。使用一个 StackWebViewCircularProgressIndicator 放在一起,当 isLoadingtrue 时,显示 CircularProgressIndicator,否则显示一个空的 Container,这样就可以 实现加载时,有一个圈圈在转,而加载完成时,圈圈消失的效果了。


微信公众号
关注公众号,获得及时更新

更多文章
  • Matebook X Pro 2019安装Debian 10
  • ArchLinux忽略某个包的升级
  • SQLAlchemy使用主从与数据库autocommit
  • Blackbox禁用IPv6
  • 预防缓存击穿
  • Go 1.13的errors挺香
  • flutter开发体验汇报
  • 自己封装一个好用的Dart HTTP库
  • Flutter应用启动后检查更新
  • Grafana Gravatar头像显示bug修复
  • flutter中使用RESTful接口
  • Vim YouCompleteMe使用LSP(以dart为例)
  • flutter webview加载时显示进度
  • SQLAlchemy快速更新或插入对象
  • 修复Linux下curl等无法使用letsencrypt证书