Flutter:如何通过方法通道传递选定的文件?或者在 flutter 中指定一个路径并让它通过 kotlin/java 工作?

tsy*_*176 5 java google-maps dart kotlin flutter

我依靠 flutter 中的本机代码将 .kml 覆盖加载到我的 Google 地图(修改后的 GoogleMapController.java)。

.kml 覆盖存储在此处:android/app/src/main/res/raw/borders.kml。

我在 main.dart 中调用我的覆盖层,如下所示:

  Future<void> addKml(GoogleMapController mapController) async {

    const MethodChannel channel = MethodChannel('flutter.native/helper');
    try {
      int kmlResourceId = await channel.invokeMethod('KML');
      return mapController.channel.invokeMethod("map#addKML", <String, dynamic>{
        'resourceId': kmlResourceId,
      });
    } on PlatformException catch (e) {
      throw 'Unable to plot map: ${e.message}';
    }
  }
Run Code Online (Sandbox Code Playgroud)

这是我的 MainActivity.kt:

class MainActivity: FlutterActivity() {

    private val CHANNEL = "flutter.native/helper"
    private var mapId: Int? = null

    override fun onCreate(savedInstanceState: Bundle?, PersistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, PersistentState)

        GeneratedPluginRegistrant.registerWith(FlutterEngine(this));

    }

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);

        MethodChannel(flutterEngine.dartExecutor,CHANNEL).setMethodCallHandler{
            call,result ->
            if (call.method == "KML") {
                result.success (getKMLResource());
            } else {
                result.notImplemented();
            }
        }
    }

    private fun getKMLResource(): Int {
        return R.raw.borders;
    }
}
Run Code Online (Sandbox Code Playgroud)

最后是我的 GoogleMapController.java:

        case "map#addKML":
            int resourceId = call.argument("resourceId");
        try {
            KmlLayer kml = new KmlLayer(googleMap, resourceId, context);
            kml.addLayerToMap();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        break;
Run Code Online (Sandbox Code Playgroud)

如何在 flutter 中指定加载 .kml 的路径?它似乎是从 kotlin 中加载的:

return R.raw.borders;
Run Code Online (Sandbox Code Playgroud)

希望有人能在这里帮助我。先感谢您。