flutter_inappwebview未设置平台实现的初始化报错求助
报错信息
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的例外配置
- Android:打开
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

