● main.dart / 2025.03.21 기준 / flutter 4.4.2 / 버전에 따라 실행이 되지 않을 수 있음

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


String firstUrl = "https://naver.com";

void main() {
  runApp(const MyApp());
}

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter WebView 예제',
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
        useMaterial3: true,
      ),
      home: const MyWebView(),
    );
  }
}


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

  @override
  State<MyWebView> createState() => _MyWebViewState();
}


class _MyWebViewState extends State<MyWebView> {
  late final WebViewController controller;
  bool isLoading = true;
  String currentUrl = firstUrl;

  @override
  void initState() {
    super.initState();
    
    controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(Colors.white)
      ..setNavigationDelegate(
        NavigationDelegate(
          onPageStarted: (String url) {
            setState(() {
              isLoading = true;
              currentUrl = url;
            });
          },
          onPageFinished: (String url) {
            setState(() {
              isLoading = false;
            });
          },
          onWebResourceError: (WebResourceError error) {
            debugPrint('웹뷰 오류: ${error.description}');
          },
        ),
      )
      ..loadRequest(Uri.parse(currentUrl));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('WebView 예제'),
        actions: [
          IconButton(
            icon: const Icon(Icons.refresh),
            onPressed: () {
              controller.reload();
            },
          ),
        ],
      ),
      body: Stack(
        children: [
          WebViewWidget(controller: controller),
          if (isLoading)
            const Center(
              child: CircularProgressIndicator(),
            ),
        ],
      ),
      bottomNavigationBar: BottomAppBar(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            IconButton(
              icon: const Icon(Icons.arrow_back),
              onPressed: () async {
                if (await controller.canGoBack()) {
                  controller.goBack();
                }
              },
            ),
            IconButton(
              icon: const Icon(Icons.arrow_forward),
              onPressed: () async {
                if (await controller.canGoForward()) {
                  controller.goForward();
                }
              },
            ),
            IconButton(
              icon: const Icon(Icons.home),
              onPressed: () {
                controller.loadRequest(Uri.parse(firstUrl));
              },
            ),
          ],
        ),
      ),
    );
  }
}

 

 

● pubspec.yaml 파일 안에서 dependencies 부분을 찾아 "webview_flutter: ^4.4.2" 입력(들여쓰기 매우 중요)

dependencies:
  flutter:
    sdk: flutter
  webview_flutter: ^4.4.2

 

 

● 안드로이드 폰을 위한 내용 추가 

- /android/app/build.gradle 파일 열기 / compileOption 부분을 찾아 / "minSdkVersion 19" 부분 추가(들여쓰기 중요)

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION        minSdkVersion flutter.mi  
        minSdkVersion 19

 

 

● 아이폰을 위한 내용 추가

- /ios/Runner/info.plist 파일 열기 / 아래 내용을

	<key>NSAppTransportSecurity</key>
	<dict>
		<key>NSAllowsArbitraryLoads</key>
 		<true/>
	</dict>

 

- 아래 사진처럼 추가

 

 

그리고 다시 실행하면 


+ Recent posts