코딩항해기
[실습/Flutter] WebView 본문

앱 내에서 웹페이지 띄우기 (WebView 활용)
dependencies
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.8
#WebView 의존 추가
webview_flutter: ^4.12.0
dart code
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart'; //webview
void main() {
runApp(const Webview());
}
class Webview extends StatelessWidget {
const Webview({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: WebviewPractice(),
);
}
}
class WebviewPractice extends StatefulWidget {
const WebviewPractice({super.key});
@override
State<WebviewPractice> createState() => _WebviewPracticeState();
}
class _WebviewPracticeState extends State<WebviewPractice> {
late final WebViewController _controller;
// 화이트리스트 도메인
final List<String> whitelist = ['naver.com', 'flutter.dev'];
// 블랙리스트 도메인
final List<String> blacklist = ['google.co.kr'];
@override
void initState() {
super.initState();
_controller = WebViewController()
..setJavaScriptMode(JavaScriptMode.unrestricted)
..setNavigationDelegate(
NavigationDelegate( //검증
onNavigationRequest: (NavigationRequest request) {
final host = Uri.parse(request.url).host; //uri의 도메인 추출
//화이트리스트 검증 또는 블랙리스트 검증 추가 위치
},
),
)
..loadRequest(Uri.parse('https://naver.com')); //첫 페이지 세팅
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('WebView')), //상단 바 세팅
body: WebViewWidget(controller: _controller), //body 전체를 웹 페이지로
);
}
}
화이트 리스트의 경우
(화이트 리스트에 있는 도메인만 허용)
// 화이트리스트 로직
if (whitelist.any((allowed) => host.contains(allowed))) { //whiteList의 요소가 host(도메인)에 포함된다면
return NavigationDecision.navigate; //허용
}
// 차단된 도메인 접근 시 알림 가능
ScaffoldMessenger.of(context).showSnackBar( //스낵바알림
SnackBar(content: Text('허용되지 않은 사이트입니다: $host')),
);
return NavigationDecision.prevent; //차단
블랙 리스트의 경우
(블랙 리스트에 있는 도메인만 비허용)
// 블랙리스트 로직
if (blacklist.any((blocked) => host.contains(blocked))) { //blackList의 요소가 host(도메인)에 포함된다면
ScaffoldMessenger.of(context).showSnackBar( //스낵바알림
SnackBar(content: Text('차단된 사이트입니다: $host')),
);
return NavigationDecision.prevent; //차단
}
return NavigationDecision.navigate; //허용'problem solving > 과제&실습 코딩' 카테고리의 다른 글
| [실습/Flutter] inappwebview로 http status 처리 (0) | 2025.05.21 |
|---|---|
| [실습/Python] 파이썬 복습 (코드 분석) (0) | 2025.01.07 |
| [실습/React] todo list (0) | 2024.12.03 |
| [실습/Spring] 이미지 수정하기 (MultipartFile) (0) | 2024.10.23 |
| [실습/Spring] AOP 활용 로그 작성 (1) | 2024.10.17 |