Flutter和原生代码的通信

简介: 我们只用Flutter实现了一个页面,现有的大量逻辑都是用Java实现,在运行时会有许多场景必须使用原生应用中的逻辑和功能,例如网络请求

1.Flutter和原生代码的通信

我们只用Flutter实现了一个页面,现有的大量逻辑都是用Java实现,在运行时会有许多场景必须使用原生应用中的逻辑和功能,例如网络请求,我们统一的网络库会在每个网络请求中添加许多通用参数,也会负责成功率等指标的监控,还有异常上报,我们需要在捕获到关键异常时将其堆栈和环境信息上报到服务器。这些功能不太可能立即使用Dart实现一套出来,所以我们需要使用Dart提供的Platform Channel功能来实现Dart→Java之间的互相调用。

以网络请求为例,我们在Dart中定义一个MethodChannel对象:

import'dart:async';
import'package:flutter/services.dart';
constMethodChannel_channel=constMethodChannel('com.kuaiX.happy/getVersion');
Future<Map<String, dynamic>>post(Stringpath, [Map<String, dynamic>form]) async {
return_channel.invokeMethod("getVersion", {'path': path, 'body': form}).then((result) {
returnnewMap<String, dynamic>.from(result);
  }).catchError((_) =>null);
}
然后在Java端实现相同名称的MethodChannel:publicclassFlutterNetworkPluginimplementsMethodChannel.MethodCallHandler {
privatestaticfinalStringCHANNEL_NAME="com.kuaiX.happy/getVersion";
@OverridepublicvoidonMethodCall(MethodCallmethodCall, finalMethodChannel.Resultresult) {
switch (methodCall.method) {
case"getVersion":
RetrofitManager.performRequest(post((String) methodCall.argument("path"), (Map) methodCall.argument("body")),
newDefaultSubscriber<Map>() {
@OverridepublicvoidonError(Throwablee) {
result.error(e.getClass().getCanonicalName(), e.getMessage(), null);
                            }
@OverridepublicvoidonNext(MapstringBaseResponse) {
result.success(stringBaseResponse);
                            }
                        }, tag);
break;
default:
result.notImplemented();
break;
        }
    }
}
在Flutter页面中注册后,调用post方法就可以调用对应的Java实现:loadData: (callback) async {
Map<String, dynamic>data=awaitgetVersion("version/level");
if (data==null) {
callback(false);
return;
    }
_data=AllCategoryResponse.fromJson(data);
if (_data==null||_data.code!=0) {
callback(false);
return;
    }
callback(true);
  }),


2.Demo实现 -> 从原生传数据到FLutter端


classAppUtils : FlutterPlugin, MethodCallHandler {
privatevarchannel: MethodChannel?=nullprivatevarsContext: Context?=nullprivatevalTAG="AppUtils"overridefunonAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel=MethodChannel(binding.getBinaryMessenger(), TAG)
channel?.setMethodCallHandler(this)
sContext=binding.getApplicationContext()
    }
overridefunonDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
channel?.setMethodCallHandler(null);
    }
overridefunonMethodCall(call: MethodCall, result: MethodChannel.Result) {
if (sContext==null) {
throwRuntimeException(" context is null  please call setContext(this) in Application.onCreate()")
        }
if (call.method.equals("getPlatformVersion")) {
result.success("Android "+android.os.Build.VERSION.RELEASE);
        } elseif (call.method.equals("getSmid")) {
        } else {
result.notImplemented();
        }
    }
}
Flutter端实现classHomeLogicextendsGetMaterialController {
staticconstMethodChannelchannel=constMethodChannel('AppUtils');
staticFuture<String?>getPlatformVersion() async {
finalString?version=awaitchannel.invokeMethod('getPlatformVersion');
returnversion;
  }
@overrideonInit(){
String?temp=awaitgetPlatformVersion();
print("12i3904201"+temp.toString());
  }
}
相关文章
|
1月前
|
存储 开发框架 开发者
flutter:代码存储&基本组件 (五)
本文档介绍了Flutter中的一些基本组件和代码示例,包括代码存储、基本组件如AppBar的简单使用、可滑动切换的标签栏、TextField的多种用法(如简单使用、登录页面、文本控制器的监听与使用、修饰等),以及如何实现点击空白区域隐藏键盘等功能。通过这些示例,开发者可以快速掌握在Flutter应用中实现常见UI元素的方法。
|
1月前
|
IDE 调度 开发工具
鸿蒙Flutter实战:08-如何调试代码
本文介绍了鸿蒙Flutter项目的开发环境搭建、配置、日志查看及调试方法。首先按照指南搭建开发环境,安装IDE插件;接着配置vscode的launch.json文件;通过IDE调试控制台或命令行查看日志;提供两种调试Flutter的方式,包括IDE直接运行和使用DevEco;最后介绍ArkTs和Webview的调试方法。
47 0
|
1月前
|
小程序 Java Android开发
flutter:注意点&快速代码&链接虚拟机&改配置 (一)
这段内容主要介绍了Flutter开发中的一些注意事项和快速代码示例。首先,在构建Flutter小程序时,`setState`方法只能在`StatefulWidget`和`State`类中使用,且初始化数据应放在`initState`方法内。接着,通过一个简单的示例展示了如何构建一个包含`Scaffold`的基本Flutter应用,并指出了在`MaterialApp`中移除调试横幅的方法。此外,文档还提供了关于搭建Flutter开发环境、配置虚拟机、解决安装错误以及配置相关文件(如`build.gradle`)的指导信息。
|
2月前
|
JSON Dart Java
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
|
3月前
|
Dart
Flutter之ExpansionTile实现以代码方式码折叠、展开
Flutter之ExpansionTile实现以代码方式码折叠、展开
121 4
|
3月前
|
Dart
Flutter笔记:手动配置VSCode中Dart代码自动格式化
Flutter笔记:手动配置VSCode中Dart代码自动格式化
466 5
|
6月前
|
Dart 安全
简化代码、提高效率:Dart和Flutter开发小技巧
在日常开发中,我们常常会使用一些常用的技巧或语法糖,以简化代码、提高开发效率。本文将分享一些在Dart和Flutter中常用的小贴士,帮助你更轻松地编写优雅高效的代码。
简化代码、提高效率:Dart和Flutter开发小技巧
|
4月前
|
安全 Shell Android开发
Flutter和Native 通信 pigeon
Flutter和Native 通信 pigeon
|
4月前
|
Dart Android开发 Windows
Flutter和Native 通信 android端
Flutter和Native 通信 android端