콜백함수는 일정 작업이 완료되면 실행되는 함수입니다.
WebviewController controller = WebviewController();
..setNavigationDelegate(NavigationDelegate(
onPageFinished: (String url) {
print(url);
}
))
onPageFinished()는 웹뷰에서 페이지 로딩이 완료된 뒤에 실행되는 콜백함수 입니다.
이외에도 onWebviewCreated(), onPageStarted(), onProgress() 등 특정 조건이 성립되었을 때 실행되는 함수도 있습니다.
웹뷰는 프레임워크에 내장된 브라우저를 앱의 네이티브 컴포넌트에 임베딩하는 기능입니다.
즉 앱에서 웹 브라우저 기능을 구현해주는 기술입니다.
웹뷰를 사용하기 위해 관련 플러그인을 설치합니다.
dependencies:
flutter:
sdk: flutter
webview_flutter: 4.4.1
flutter pub get
웹뷰를 사용하려면 몇 가지 네이티브 설정이 필요합니다.
인터넷 사용 권한
버전 설정
(선택) http 설정
android/app/src/main/AndroidManifest.xml에서 아래와 같이 인터넷 권한을 추가합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.blog_web_app">
<uses-permission android:name="android.permission.INTERNET" />
...
</manifest>
다음으로 웹뷰를 사용하기 위해 버전을 변경해줍니다.
android/app/build.gradle 에서 아래와 같이 변경합니다.
android/app/build.gradle은 모듈 파일이며 의존성이나 버전 정보를 관리합니다.
참고로 android/build.gradle과 andgroid/app/build.gradle은 서로 다른 파일이니 유의해줍니다.
android {
compileSdkVersion 33
..
defaultConfig {
applicationId "com.example.blog_web_app"
minSdkVersion 20 // webview_flutter 플로그인은 안드로이드의 최소 SDK 버전이 20 이상 필요
...
}
}
마지막으로 http 허용을 위해 android/app/src/main/AndroidManifest.xml에서 아래와 같이 추가합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.blog_web_app">
<uses-permission android:name="android.permission.INTERNET" />
<application
...
android:usesCleartextTraffic="true">
...
</application>
</manifest>
ios/Runner/Info.plist 파일에서 http 프로토콜을 허용하는 설정을 해줍니다.
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
<key>NSAllowsArbitraryLoadsInWebContent</key>
<true/>
</dict>
</dict>
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
class HomeScreen extends StatelessWidget {
// 웹뷰 컨트롤러 생성
WebViewController webViewController = WebViewController()
// 해당 url로 웹뷰가 로드됩니다. Uri.parse를 사용하여 입력한 url 문자열이 Uri 객체로 변환됩니다.
..loadRequest(Uri.parse('https://blod.codefactory.ai'))
// js 실행을 허용합니다.
..setJavaScriptMode(JavaScriptMode.unrestricted);
HomeScreen({Key? key}) : super(key: key);
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Code factory'),
backgroundColor: Colors.orange,
// 가운데 정렬
centerTitle: true,
// AppBar에 액션 버튼을 추가할 수 있는 매개변수
actions: [
IconButton(
onPressed: () {
webViewController
.loadRequest(Uri.parse('https://blod.codefactory.ai'));
},
icon: Icon(Icons.home),
)
],
),
body: WebViewWidget(
controller: webViewController,
),
);
}
}
import 'package:blog_web_app/screen/home_screen.dart';
import 'package:flutter/material.dart';
void main() {
// 플러터 프레임워크가 앱을 실행할 준비가 될 때까지 기다림
WidgetsFlutterBinding.ensureInitialized();
runApp(
MaterialApp(
home: HomeScreen(),
),
);
}
《Must Have 코드팩토리의 플러터 프로그래밍 2판》의 스터디 내용 입니다.