.addJavaScriptChannel()
๋ฅผ ํตํด ์น์์ ํ๋ฌํฐ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด ๋ฏธ๋ฆฌ ์์ฑํ๋ ์ปจํธ๋กค๋ฌ์ ์ฑ๋์ ์ ์ธํด์ฃผ์ด์ผ ํฉ๋๋ค.
// webview_controller.dart
..addJavaScriptChannel(
'ChannelName',
onMessageReceived: (JavaScriptMessage message) {
debugPrint(message.message);
},
)
ํ๋ฌํฐ์์ ์ฑ๋์ ๋ฑ๋กํ์์ผ๋ฉด javascript๋ฅผ ํตํด ์ฑ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
ChannelName.postMessage('hello');
๋ฏธ๋ฆฌ ๋ฑ๋กํ ChannelName
์ผ๋ก .postMessage(value)
๋ฅผ ๋ณด๋ด๊ฒ ๋ฉ๋๋ค.
๋ถ๋ช ๋ง๋๊ฒ ๋ Error
ํ์ง๋ง javascript์๋
ChannelName
์ด๋ผ๋ ์ธ์คํด์ค๊ฐ ๋ฑ๋ก๋์ด ์์ง ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด ์๋์ ์ฃผ์์ ์ฝ๋ ์ ๋ถ๋ถ์ ์ถ๊ฐํ์์ต๋๋ค.// in javascript // eslint-disable-next-line @typescript-eslint/ban-ts-comment //@ts-ignore ChannelName.postMessage('hello');
Web ํ๊ฒฝ: reactJs + ts + eslint
๊ฐ๋ฐํ๊ณ ์๋ ํ๊ฒฝ์ ์น๊ณผ ํ๋ฌํฐ ํ๊ฒฝ ๋ชจ๋์์ ๊ตฌ๋๋์ด์ผ ํ๋ฏ๋ก ํ๋ฌํฐ์์๋ง ์คํ๋๋๋ก ํ๊ณ ์ถ์์ต๋๋ค.
์ด๋ฅผ ์ํด Flutter โถ๏ธ Web
๊ฐ์ ํต์ ์ด ํ์ํ๋ฉฐ ์๋์ ๋ด์ฉ์ ํฌํจ๋์ด ์์ต๋๋ค.
ํ๋ฌํฐ ํ๊ฒฝ์์๋ ์ฌ์ ์ ๋ฑ๋กํ ์ปจํธ๋กค๋ฌ ํจ์๋ด์ javascript ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.
๐ ์ฃผ์!
์์ ๋ ๋ฉ์๋๋ค์ javascript root page (index.html) ์์ ์คํผํ ์ ์๋ ์ฝ๋์ด์ฌ์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด reactJs์ ๊ฐ์ ํจ์์์ ์ ์ธ๋ ์ฝ๋๋ค์ ์คํ ํ ์ ์์์ผ๋ฉฐ,
๋ธ๋ผ์ฐ์ ์ ์ฝ์์์ ์คํํ ์ ์๋ ์ฝ๋๋ค์ ๋๋ถ๋ถ ๊ฐ๋ฅํ์์ต๋๋ค.
initFlutter()
ํ๋ฌํฐ WebView ํ๊ฒฝ์์๋ง Javascript ์ฝ๋๊ฐ ์คํ๋ ์ ์๊ฒ localStorage์ ํ๋ฌํฐ๋ฅผ ๊ตฌ๋ถํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
getJsMessage()
return ๊ฐ์ด ์ถ๊ฐ๋ ์์ ์ฝ๋์
๋๋ค.
// webview_controller.dart
void initFlutter() {
controller.runJavaScript('localStorage.setItem("isFlutter", "1")');
}
Future<String> getJsMessage() async {
//์น localStorage์ ์ ์ฅํด ์์ boolean ๊ฐ ํธ์ถ
final result = await controller.runJavaScriptReturningResult(
'JSON.parse(localStorage.getItem("storageKey"))') as String;
print("result: $result");
return result;
}
// webview_controller.dart
//GetX๋ผ๋ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ปจํธ๋กค๋ฌ ํ์ฉ
class WebviewMainController extends GetxController {
//WebviewMainController ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ฐํ
static WebviewMainController get to => Get.find();
//controller ๊ฐ์ฒด ์ ์ธ
final WebViewController controller = WebViewController()
//์๋ฐ์คํธ๋ฆฝํธ ์ฌ์ฉ ์ฌ๋ถ
..setJavaScriptMode(JavaScriptMode.unrestricted)
//์น๋ทฐ ๊ด๋ จ ์ด๋ฒคํธ๋ค
..setNavigationDelegate(
NavigationDelegate(
onProgress: (int progress) {
debugPrint('progressing $progress');
},
onPageStarted: (String url) {
debugPrint(url);
},
onPageFinished: (String url) {
debugPrint('Page Finished');
},
onWebResourceError: (WebResourceError error) {},
),
)
// ๐ ์ถ๊ฐ
..addJavaScriptChannel(
'ChannelName',
onMessageReceived: (JavaScriptMessage message) {
debugPrint(message.message);
//... anything
},
)
//์ ์ํ [URL]์ ์ฝ์
..loadRequest(Uri.parse([URL]));
// ๋ค๋ฅธ ํ์ผ์์ controller๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํจ
WebViewController getController() {
return controller;
}
// ๐ ์ถ๊ฐ
void initFlutter() {
controller.runJavaScript('localStorage.setItem("isFlutter", "1")');
}
Future<String> getJsMessage() async {
//์น localStorage์ ์ ์ฅํด ์์ boolean ๊ฐ ํธ์ถ
final result = await controller.runJavaScriptReturningResult(
'JSON.parse(localStorage.getItem("storageKey"))') as String;
print("result: $result");
return result;
}
}
// in javascript
//flutter์์๋ง ์๋ํ ์ ์๋๋ก
if (localStorage.getItem("isFlutter") === "1") {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
ChannelName.postMessage(message);
}
ํน์ ts๊ฐ ์๋ js๋ฅผ ์ฐ๋๊ฒฝ์ฐ๋ ์ฃผ์์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผํ๋์