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,),
            	),
            ),
        );
    }
}