์ฒซ ๋ฒ์งธ ๊ธฐ๋ฅ์ธ ์ด๋ฒคํธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ๋ถํฐ ๊ตฌํํด๋ณด์.
์ธ๋ถ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ์ฑ ๋ด๋ถ์์ ์ด๋ฒคํธ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด '์น ๋ทฐ' ํ์์ ์ฌ์ฉํด๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ pubspec.yaml ํ์ผ์ ์ข ์์ฑ(dependencies)์
dependencies:
flutter:
sdk: flutter
webview_flutter: ^4.13.1
์ด๋ฐ์์ผ๋ก ์ต์ ๋ฒ์ ์ ์ถ๊ฐํด์ฃผ๊ณ
ํฐ๋ฏธ๋์์ flutter pub get ์ผ๋ก ์น ๋ทฐ ํจํค์ง๋ฅผ ์ค์นํด์ค๋ค.
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ์น๋ทฐ ๊ถํ ์ค์ ์ ์ํด
android/app/src/main/AndroidManifest.xml ํ์ผ์
<uses-permission android:name="android.permission.INTERNET"/>
android:usesCleartextTraffic="true"
๋ ๊ถํ์ ์ถ๊ฐํด์ค๋ค.
์ด์ ์ฝ๋๋ก ๋์๊ฐ์
class AirlineEvent {
final String name;
final String url;
AirlineEvent({required this.name, required this.url});
}
์์ ๊ฐ์ด ํ์์ ์ ์ํด์ฃผ๊ณ ,
final List<AirlineEvent> events = [
AirlineEvent(name: '๋ํํญ๊ณต', url: 'https://www.koreanair.com/contents/promotion/list'),
AirlineEvent(name: '์์์๋ํญ๊ณต', url: 'https://flyasiana.com/C/KR/KO/event/index?menuId=CM201802220000728482')
];
ํ ์คํธ๋ก ๋ ํญ๊ณต์ฌ์ ์ด๋ฆ๊ณผ ์ด๋ฒคํธ ํ์ด์ง url์ ์ถ๊ฐํ๋ค.
์์ ์ ์ํ๋ ์ด๋ฒคํธ ํ์ด์ง ์์ ฏ์๋ ๊ฐ ํญ๊ณต์ฌ๋ณ ๋ฒํผ์ ๋ฃ์ด์ฃผ๊ณ
class EventPage extends StatelessWidget {
const EventPage({super.key});
@override
Widget build(BuildContext context) {
return ListView(
children: events.map((event) {
return ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EventWebView(
title: event.name,
url: event.url,
),
),
);
},
child: Text(event.name),
);
}).toList(),
);
}
}
์ต์ข ์ ์ผ๋ก ์น ๋ทฐ๋ฅผ ๋ด๋นํ๋ ์์ ฏ์ ์์ฑํ๋ฉด
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class EventWebView extends StatefulWidget {
final String title;
final String url;
const EventWebView({
super.key,
required this.title,
required this.url,
});
@override
State<EventWebView> createState() => _EventWebViewPageState();
}
class _EventWebViewPageState extends State<EventWebView> {
late final WebViewController controller;
@override
void initState() {
super.initState();
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..loadRequest(Uri.parse(widget.url));
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: WebViewWidget(controller: controller),
);
}
}
๋ฒํผ์ ๋๋ฅด๋ฉด ์ ๋ ฅํ ์ด๋ฒคํธ ํ์ด์ง๊ฐ ์ ์ถ๋ ฅ๋๋๊ฒ์ ํ์ธํ ์ ์๋ค.

* ์๋ฎฌ๋ ์ดํฐ์์ ์ฑ ์คํํ๋ ๋ฐฉ๋ฒ
ํฐ๋ฏธ๋์์ flutter emulators๋ฅผ ์ ๋ ฅํ์ฌ ์๋ฎฌ๋ ์ดํฐ ์ด๋ฆ์ ํ์ธํ ๋ค,
flutter emulators --launch ์๋ฎฌ๋ ์ดํฐ์ด๋ฆ ์ ์ ๋ ฅํ์ฌ ์๋ฎฌ๋ ์ดํฐ๋ฅผ ์คํํ๊ณ flutter run์ ์ ๋ ฅํ๋ฉด
์๋ฎฌ๋ ์ดํฐ์์ ์ฑ์ด ์คํ๋๋ค.