๋ชฉํ
ํ๋ฌํฐ APP์์ webview_flutter ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ์ต์ํ์ ์ฝ๋๋ก ๋ฆฌ์กํธ ์นํ์ด์ง๋ฅผ ๋์ด๋ค.
ํ๋ฌํฐ ํ๋ก์ ํธ ์ค๋น
webview_flutter ํ๋ฌ๊ทธ์ธ ์ค์น
webview_flutter ํ๋ฌ๊ทธ์ธ ์ค์น
webview_flutter ํจํค์ง ๊ณต์๋ฌธ์์ ๋์์๋๋๋ก ์๋์ ๊ฐ์ด ์ค์นํ๋ค.
flutter pub add webview_flutter
์น๋ทฐํ๋ฌํฐ ํจํค์ง๊ฐ ์ค์น๋๋ฉด ์๋์๊ฐ์ด `pubspec.yaml` ํ์ผ dependencies์ ํจํค์ง๊ฐ ์ถ๊ฐ๋๋ค.
ํ๋ก์ ํธ์ WebView ์์ ฏ ์ถ๊ฐ
webview_flutter ๊ณต์๋ฌธ์ > readme ์ ๋์์๋ ์ฌ์ฉ๋ฒ๋ง ๋ณด๊ณ ๋ ํ๋์ ํ์ ํ๊ธฐ๊ฐ ํ๋ค์๋ค;;
์น๋ทฐ๋ฅผ ๋์ฐ๋ ๋ถ๋ถ์ ์๋์ ๊ตฌ๊ธ codelabs ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ๋ค.
https://codelabs.developers.google.com/codelabs/flutter-webview#3
lib/main.dart
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
void main() {
runApp(
MaterialApp(
theme: ThemeData(useMaterial3: true),
home: const WebViewApp(),
),
);
}
class WebViewApp extends StatefulWidget {
const WebViewApp({super.key});
@override
State<WebViewApp> createState() => _WebViewAppState();
}
class _WebViewAppState extends State<WebViewApp> {
late final WebViewController controller;
@override
void initState() {
super.initState();
controller = WebViewController()
..loadRequest(
Uri.parse('https://flutter.dev'),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Flutter WebView'),
),
body: WebViewWidget(
controller: controller,
),
);
}
}
์น๋ทฐ ์ปจํธ๋กค๋ฌ `WebViewController`๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ปจํธ๋กค๋ฌ๋ฅผ ์น๋ทฐ ์์ ฏ์ธ `WebViewWidget`์ ์ ๋ฌํ๋ค.
๊ทธ๋ฌ๋ฉด ํ๋ฌํฐ ๊ณต์ํํ์ด์ง๊ฐ ์ฑ ๋ด๋ถ์ ์น๋ทฐ๋ก ์ ๋ฌ๋ค!
๋ฆฌ์กํธ ํ์ด์ง ๋์ฐ๊ธฐ
๊ทธ๋ผ ์ด์ ๋ด๊ฐ ๋ง๋ ์ฌ๋ดํ๋ก์ ํธ ๋ฆฌ์กํธ ํ์ด์ง๋ฅผ ๋์๋ดค๋ค.
controller = WebViewController()
..loadRequest(
Uri.parse('https://ํ๋ก์ ํธ ๋ฐฐํฌ์ฃผ์')
๊ทผ๋ฐ ํ๋ฉด์ด ์~์ ๋จ์ง์์๋ค.. ๊ทธ๋ฅ ๋นํ๋ฉด..
๋ฆฌ์กํธ๋ก ๋ง๋ ๋ํ์ ์ธ ์น์ฌ์ดํธ๋ฅผ ํ๋ฒ ๋์๋ณด์
๋ฌธ์ ๋ JavaScriptMode ์๋ค.
์น๋ทฐ ๋ด์์ JavaScript๋ฅผ ํ์ฉํ ์ง ์ปจํธ๋กค ํ๊ธฐ์ํด์ ์ปจํธ๋กค๋ฌ์ setJavaScriptMode ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted) //<-- ์ถ๊ฐ
ํด๋น ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ์ด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑํ ์นํ์ด์ง๋ ์ ๋ฌ๋ค!
์ถ๊ฐ ์ด์
์น๋ทฐ ํ์ด์ง๊ฐ ๊ธฐ๊ธฐ ์์คํ app bar๋ฅผ ๊ตฌ๋ถํ์ง ๋ชปํ๋ ํ์
๊ทธ๋ฐ๋ฐ, Scaffold ๋ด๋ถ์ Flutter WebView ๋ผ๋ AppBar๋ฅผ ์ ๊ฑฐํ๊ณ ๋ ์ดํ ์น๋ทฐ๋ก ๋์ธ ๊ฒฝ์ฐ ๊ธฐ๊ธฐ ์์ฒด์ ์์คํ appbar ์์ญ์ ๊ตฌ๋ถํ์ง ๋ชปํ๊ณ , ์น๋ทฐ ํ์ด์ง๊ฐ ๊ธฐ๊ธฐ ์ ์ฒด์์ญ์ ๋ฎ์ด๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ณต์๋ฌธ์์์ ๋ณด๋ ์น๋ทฐ๋ฅผ ๋์ฐ๋ ๊ฒฝ์ฐ ๋๋ฐ์ด์ค์ full bleed browser window ํฌ๊ธฐ๋ก ๋์ด๋ค๊ณ ํ๋ ๋ํํ ๋ง ์๊ธฐ๋ ๋ฒ๊ทธ๊ฐ ์๋ ์๋ ๋ฐ์ํ๋ ํ์์ด๋ผ๊ณ ํ๋ค.
Running this on iOS or Android will show a WebView as a full bleed browser window on your device, which means that the browser is shown on your device in fullscreen without any form of border or margin.
๋์ ๊ฒฝ์ฐ๋ ์น๋ทฐ ํ์ด์ง ์์ญ์ด ์์คํ
๊ธฐ๊ธฐ์ abb bar๋ฅผ ์นจ๋ฒํ๋ ํด๋น ๋ฌธ์ ๋ ์น๋ทฐ์ธ ๊ฒฝ์ฐ์๋ ์ต์๋จ์ padding ๊ฐ์ ๋ ์ฃผ์ด์ ํด๊ฒฐํ๋ค. ๊ทธ๋ฆฌํ์ฌ ์น๋ทฐ ํ์ด์ง๋ ํจ๋ฉ ๊ฐ๊ฒฉ ์๋๋ถํฐ ๋จ๋ฏ๋ก ์์คํ
app bar ์๋๋ถํฐ ์น๋ทฐ ํ์ด์ง๊ฐ ํ๋ฉด์ ๋์์ง๋ค.
์์ ๊ฐ์ด ์น ํ๋ก ํธ์์ padding์ ์ฃผ๋๊ฒฝ์ฐ ๊ธฐ๊ธฐ๋ณ๋ก ๋ฌ๋ผ์ง๋ ํ๋ฉด์ ๋์ํ์ง ๋ชปํ๋ฏ๋ก ์ข์ ํด๊ฒฐ๋ฒ์ ์๋๋ค. ๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ํํ ์๊ธฐํด์ ๋ชจ๋ฐ์ผ์ชฝ์์ ์์คํ ์์ฒด์ system appbar๊ฐ ๊ฐ๋ ค์ง์ง์๊ฒ ์ฝ๋๋ฅผ ์์ ํด๋ฌ๋ผ๊ณ ํ๋ฉด ๋๋ค. ๋ชจ๋ฐ์ผ์์ SafeArea ๋ผ๋ ์์ ฏ์ผ๋ก ๊ฐ์ธ๊ณ ๋๋ฉด ๊น๋ํ ํด๊ฒฐ๋๋ค.
References
https://luvris2.tistory.com/713
'Flutter' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
flutter webview ERR_CLEARTEXT_NOT_PERMITTED (0) | 2024.05.29 |
---|---|
flutter ์ค์น ๋ฐ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ - VS Code, Android Studio ํ๊ฒฝ (Mac silicon) (0) | 2024.04.01 |