controller.dart 1.9 KB
/*
 * @Author: 卢靖康
 * @Date: 2024-04-24 08:22:16
 * @LastEditTime: 2024-04-24 11:05:00
 * @LastEditors: 卢靖康
 */
import 'dart:convert';

import 'package:get/get.dart';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

class MapController extends GetxController {
  MapController();

  GlobalKey webViewKey = GlobalKey();
  InAppWebViewController? webViewController;
  final InAppLocalhostServer localhostServer = InAppLocalhostServer(
    documentRoot: './assets/',
  );

  _initData() {
    update(["map"]);
  }

  setMapWebviewController(InAppWebViewController controller) {
    webViewController = controller;
  }

  void _setupPostMessageListeners(InAppWebViewController controller) {}

  void onWebViewCreated(InAppWebViewController controller) {
    setMapWebviewController(controller);
    _setupPostMessageListeners(controller);
  }

  void onLoadStart(controller, url) {}
  void onLoadStop(controller, url) {}

  @override
  Future<void> onInit() async {
    super.onInit();
    await localhostServer.start();
  }

  @override
  void onReady() {
    super.onReady();
    _initData();
  }

  // @override
  // void onClose() {
  //   super.onClose();
  // }
}

class JSBridge {
  final InAppWebViewController _webViewController;

  JSBridge(this._webViewController);

  Future<void> callHandler(String handlerName,
      [Map<String, dynamic> data = const {}]) async {
    await _webViewController.evaluateJavascript(source: """
      window.$handlerName(${jsonEncode(data)});  
      """);
  }

  Future<void> addListener(String eventName, callback) async {
    _webViewController.addJavaScriptHandler(
        handlerName: eventName,
        callback: (result) {
          callback(result);
        });
  }

  Future<void> removeListener(String eventName) async {
    _webViewController.removeJavaScriptHandler(handlerName: eventName);
  }
}