Flutter
WebView
unknown32
2023. 9. 26. 09:04
pubspec.yaml
dependencies:
flutter:
sdk: flutter
webview_flutter:
webview_flutter_android:
webview_flutter_wkwebview:
Console
flutter pub get
Project > ios > Runner > Info.plist
<dict>
<key>io.flutter.embedded_views_preview</key>
<string>YES</string>
@추가부분@
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
@@
</dict>
</plist>
Project > android > app src > main > AndroidManifest.xml에서 permission & clear text 추가
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<application
...
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
</application>
</manifest>
main.dart
import 'package:webview_flutter/webview_flutter.dart';
import 'package:webview_flutter_android/webview_flutter_android.dart';
import 'package:webview_flutter_wkwebview/webview_flutter_wkwebview.dart';
class ... extends State<...Page> {
late final WebViewController _webviewController;
@override
void initState() {
initWebView();
super.initState();
}
void initWebView() {
late final PlatformWebViewControllerCreationParams params;
if (WebViewPlatform.instance is WebKitWebViewPlatform) {
params = WebKitWebViewControllerCreationParams(
allowsInlineMediaPlayback: true,
mediaTypesRequiringUserAction: const <PlaybackMediaTypes>{},
);
} else {
params = const PlatformWebViewControllerCreationParams();
}
final WebViewController webviewController = WebViewController.fromPlatformCreationParams(params);
webviewController
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setBackgroundColor(const Color(0x00000000))
..setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
debugPrint('WebView is loading (progress : $progress%)');
},
onPageStarted: (String url) {
debugPrint('Page started loading: $url');
},
onPageFinished: (String url) {
debugPrint('Page finished loading: $url');
},
onWebResourceError: (WebResourceError error) {
debugPrint('''
Page resource error:
code: ${error.errorCode}
description: ${error.description}
errorType: ${error.errorType}
isForMainFrame: ${error.isForMainFrame}
''');
},
onNavigationRequest: (NavigationRequest request) {
debugPrint('allowing navigation to ${request.url}');
return NavigationDecision.navigate;
},
),
)
..addJavaScriptChannel(
'Toaster',
onMessageReceived: (JavaScriptMessage message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message.message)),
);
},
)
..loadRequest(Uri.parse('https://...'));
if (webviewController.platform is AndroidWebViewController) {
AndroidWebViewController.enableDebugging(true);
(webviewController.platform as AndroidWebViewController).setMediaPlaybackRequiresUserGesture(false);
}
_webviewController = webviewController;
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Container(
child: WebViewWidget(controller: _webviewController,),
),
),
);
}
}