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

flutter_inappwebview未设置平台实现的初始化报错求助

解决flutter_inappwebview初始化报错:A platform implementation for flutter_inappwebview has not been set

报错信息

A platform implementation for flutter_inappwebview has not been set. Please ensure that an implementation of InAppWebViewPlatform has been set to InAppWebViewPlatform.instance before use. For unit testing, InAppWebViewPlatform.instance can be set with your own test implementation.
'package:flutter_inappwebview_platform_interface/src/in_app_webview/platform_inappwebview_widget.dart':
Failed assertion: line 215 pos 7: 'InAppWebViewPlatform.instance != null'

我的代码

main.dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; // Correct import
import 'screen/splash_screen.dart'; // Ensure you have the correct path

// Initialize WebView environment for Windows
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  if (defaultTargetPlatform == TargetPlatform.windows) {
    try {
      final availableVersion = await WebViewEnvironment.getAvailableVersion();
      assert(availableVersion != null, 'WebView2 Runtime not found.');

      // Initialize WebView environment with a custom user data folder
      await WebViewEnvironment.create(
          settings: WebViewEnvironmentSettings(userDataFolder: 'inappwebviewdata')
      );
    } catch (e) {
      print("Error initializing WebView2: $e");
      // Handle WebView2 initialization failure (maybe show a user-friendly message)
    }
  }

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter Demo',
      home: SplashScreen(),  // Your splash screen
    );
  }
}

HomeScreen.dart

import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  late InAppWebViewController webViewController;
  double progress = 0.0; // Track page load progress

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('WebView Example'),
        actions: <Widget>[
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () {
              webViewController.reload();
            },
          ),
        ],
      ),
      body: Column(
        children: <Widget>[
          // Progress Indicator
          progress < 1.0
              ? LinearProgressIndicator(value: progress)
              : Container(),

          // WebView
          Expanded(
            child: InAppWebView(
              initialUrlRequest: URLRequest(url: WebUri("https://www.google.com")),
              onWebViewCreated: (controller) {
                webViewController = controller;
              },
              onLoadStart: (controller, url) {
                print("Started: $url");
                setState(() {
                  progress = 0.1; // Start loading progress
                });
              },
              onLoadStop: (controller, url) async {
                print("Stopped: $url");
                setState(() {
                  progress = 1.0; // Complete loading
                });
              },
              onProgressChanged: (controller, progress) {
                setState(() {
                  this.progress = progress / 100;
                });
              },
              onReceivedError: (controller, request, error) {
                print("Error: $error");
                // Handle error here, you might want to show a custom error screen.
              },
            ),
          ),
        ],
      ),
    );
  }
}

解决方案

1. 补全各平台初始化逻辑

报错核心是平台实现未正确注册,针对不同平台调整:

  • Android/iOS:无需手动初始化,但要确保项目配置合规:

    • Android:打开android/app/build.gradle,将minSdkVersion设为17及以上;AndroidManifest.xml中添加<uses-permission android:name="android.permission.INTERNET"/>
    • iOS:打开ios/Podfile,设置platform :ios, '9.0';若需加载HTTP内容,在Info.plist中添加NSAppTransportSecurity的例外配置
  • Windows:现有初始化逻辑需补充关联平台实例,修改main函数:

    Future<void> main() async {
      WidgetsFlutterBinding.ensureInitialized();
    
      if (defaultTargetPlatform == TargetPlatform.windows) {
        try {
          final availableVersion = await WebViewEnvironment.getAvailableVersion();
          assert(availableVersion != null, 'WebView2 Runtime not found.');
    
          // 初始化WebView环境并关联到平台
          final environment = await WebViewEnvironment.create(
              settings: WebViewEnvironmentSettings(userDataFolder: 'inappwebviewdata')
          );
          await InAppWebViewController.setWebViewEnvironment(environment);
        } catch (e) {
          print("Error initializing WebView2: $e");
        }
      }
    
      runApp(const MyApp());
    }
    

2. 重置依赖与构建缓存

  • 执行flutter clean清理缓存,再执行flutter pub get重新下载依赖
  • Windows平台额外删除windows/build文件夹,再重新运行flutter run

3. 手动注册平台实现(调试用)

如果自动注册失效,可在main函数手动指定平台实现:

import 'package:flutter_inappwebview_platform_interface/flutter_inappwebview_platform_interface.dart';
import 'package:flutter_inappwebview_windows/flutter_inappwebview_windows.dart'; // Windows平台实现
// Android平台对应导入:package:flutter_inappwebview_android/flutter_inappwebview_android.dart
// iOS平台对应导入:package:flutter_inappwebview_ios/flutter_inappwebview_ios.dart

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();

  if (defaultTargetPlatform == TargetPlatform.windows) {
    // 手动注册Windows平台实现
    InAppWebViewPlatform.instance = WindowsInAppWebViewPlatform();
    
    try {
      final availableVersion = await WebViewEnvironment.getAvailableVersion();
      assert(availableVersion != null, 'WebView2 Runtime not found.');

      await WebViewEnvironment.create(
          settings: WebViewEnvironmentSettings(userDataFolder: 'inappwebviewdata')
      );
    } catch (e) {
      print("Error initializing WebView2: $e");
    }
  }

  runApp(const MyApp());
}

4. 检查版本兼容性

确认flutter_inappwebview:6.1.5与当前Flutter版本兼容,该版本要求Flutter最低2.5.0以上,若你的Flutter版本过低,建议升级Flutter或调整包版本。

内容的提问来源于stack exchange,提问作者Tanmay Nandwana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 07:32:12