You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SpinKitCircle组件嵌入Flutter页面的body中?

实现方案

要把加载动画嵌入到带WebView的页面body中,核心思路是用Stack层叠WebView和加载指示器,通过状态变量控制动画的显示/隐藏。以下是完整的实现代码:

import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';

class WebViewPage extends StatefulWidget {
  const WebViewPage({super.key});

  @override
  State<WebViewPage> createState() => _WebViewPageState();
}

class _WebViewPageState extends State<WebViewPage> {
  late WebViewController _webViewController;
  bool _isLoading = true; // 控制加载动画的显示状态

  @override
  void initState() {
    super.initState();
    _webViewController = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setNavigationDelegate(
        NavigationDelegate(
          onPageStarted: (String url) {
            setState(() => _isLoading = true);
          },
          onPageFinished: (String url) {
            setState(() => _isLoading = false);
          },
          onWebResourceError: (WebResourceError error) {
            setState(() => _isLoading = false);
            // 可在此添加加载错误的处理逻辑
          },
        ),
      )
      ..loadRequest(Uri.parse("https://example.com"));
  }

  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        // 处理物理返回键:优先让WebView回退
        if (await _webViewController.canGoBack()) {
          _webViewController.goBack();
          return false;
        }
        return true;
      },
      child: Scaffold(
        appBar: AppBar(
          title: const Text("WebView页面"),
          centerTitle: true,
        ),
        body: SafeArea(
          child: Stack(
            children: [
              // WebView主体
              WebViewWidget(controller: _webViewController),
              // 加载动画:仅在_isLoading为true时显示
              if (_isLoading)
                Container(
                  color: Colors.black54, // 半透明背景提升动画辨识度
                  child: const Center(
                    child: SpinKitCircle(size: 140, color: Colors.white),
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

关键细节说明

  • 状态控制:通过_isLoading变量控制动画显示,WebView开始加载时触发onPageStarted将其设为true,加载完成/出错时通过onPageFinished/onWebResourceError设为false。
  • Stack布局:让加载动画覆盖在WebView上方,加载完成后自动隐藏,不影响WebView的交互。
  • 依赖配置:需要在pubspec.yaml中添加对应依赖:
dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^4.4.0 # 建议使用最新稳定版
  flutter_spinkit: ^5.2.0 # 建议使用最新稳定版

内容的提问来源于stack exchange,提问作者victor park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:25:43