创建MyPlugin

class MyPlugin : FlutterPlugin {

override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {

val messenger: BinaryMessenger = binding.binaryMessenger

binding

.platformViewRegistry

.registerViewFactory(

“plugins.flutter.io/custom_platform_view”, MyFlutterViewFactory(messenger))

}

companion object {

@JvmStatic

fun registerWith(registrar: PluginRegistry.Registrar) {

registrar

.platformViewRegistry()

.registerViewFactory(

“plugins.flutter.io/custom_platform_view”,

MyFlutterViewFactory(registrar.messenger()))

}

}

override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {

}

}

说明:

  • plugins.flutter.io/custom_platform_view ,这个字符串在 Flutter 中需要与其保持一致

2.5 在 App 中 MainActivity 中注册

class MainActivity : FlutterActivity() {

override fun configureFlutterEngine(flutterEngine: FlutterEngine) {

super.configureFlutterEngine(flutterEngine)

flutterEngine.plugins.add(MyPlugin())

}

}

2.6 嵌入Flutter

void main() => runApp(PlatformViewDemo());

class PlatformViewDemo extends StatelessWidget {

@override

Widget build(BuildContext context) {

Widget? platformView(){

if(defaultTargetPlatform == TargetPlatform.android){

return AndroidView(

viewType: ‘plugins.flutter.io/custom_platform_view’

);

}

}

return MaterialApp(

home: Scaffold(

appBar: AppBar(title: Text(“Flutter Demo”),),

body: Center(

child: platformView(),

),

),

);

}

}

2.7 效果图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

三 设置初始化参数


3.1 Flutter 端修改如下

AndroidView(

viewType: ‘plugins.flutter.io/custom_platform_view’,

creationParams: {‘text’: ‘Flutter传给AndroidTextView的参数’},

creationParamsCodec: StandardMessageCodec(),

)

说明:

  • creationParams :传递的参数,插件可以将此参数传递给 AndroidView 的构造函数

  • creationParamsCodec :将 creationParams 编码后再发送给平台侧,它应该与传递给构造函数的编解码器匹配。值的范围:

  • StandardMessageCodec

  • JSONMessageCodec

  • StringCodec

  • BinaryCodec

3.2 修改 MyFlutterView

class MyFlutterView(context: Context, messenger: BinaryMessenger, viewId: Int, args: Map<String, Any>?) : PlatformView {

val textView: TextView = TextView(context)

init {

args?.also {

textView.text = it[“text”] as String

}

}

override fun getView(): View {

return textView

}

override fun dispose() {

TODO(“Not yet implemented”)

}

}

说明:

  • it[“text”]为Flutter端参数text,获取到的值为Flutter传给AndroidTextView的参数

3.3 效果图

四 Flutter 向 Android View 发送消息


4.1 修改 Flutter 端,创建 MethodChannel 用于通信

void main() => runApp(PlatformViewDemo());

class PlatformViewDemo extends StatefulWidget {

@override

State createState() => _PlatformViewDemoState();

}

class _PlatformViewDemoState extends State {

static const platform = const MethodChannel(‘com.example.androidflutter.MyFlutterView’);

@override

Widget build(BuildContext context) {

Widget? platformView() {

if (defaultTargetPlatform == TargetPlatform.android) {

return AndroidView(

viewType: ‘plugins.flutter.io/custom_platform_view’,

creationParams: {‘text’: ‘Flutter传给AndroidTextView的参数’},

creationParamsCodec: StandardMessageCodec(),

);

}

}

return MaterialApp(

home: Scaffold(

appBar: AppBar(title: Text(“Flutter”),),

body: Column(children: [

RaisedButton(

child: Text(‘传递参数给原生View’),

onPressed: () {

platform.invokeMethod(‘setText’, {‘name’: ‘张三’, ‘age’: 18});

},

),

Expanded(child: Center(child: platformView(),)),

]),

),

);

}

}

说明:

  • MethodChannel(‘com.example.androidflutter.MyFlutterView’):为原生端MyFlutterView的全路径

4.2 原生View 中也创建一个 MethodChannel 用于通信

class MyFlutterView(context: Context, messenger: BinaryMessenger, viewId: Int, args: Map<String, Any>?):PlatformView, MethodChannel.MethodCallHandler {

val textView: TextView = TextView(context)

private lateinit var methodChannel: MethodChannel

init {

args?.also {

textView.text = it[“text”] as String

methodChannel = MethodChannel(messenger, “com.example.androidflutter.MyFlutterView”)

methodChannel.setMethodCallHandler(this)

}

}

override fun getView(): View {

return textView

}

override fun dispose() {

methodChannel.setMethodCallHandler(null)

}

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {

if (call.method == “setText”) {

val name = call.argument(“name”) as String?

val age = call.argument(“age”) as Int?

textView.text = “hello, n a m e , 年龄: name,年龄: name,年龄:age”

} else {

result.notImplemented()

}

}

}

说明:

  • MethodChannel(messenger, “com.example.androidflutter.MyFlutterView”)为MyFlutterView的全路径,与Flutter端保持一致

4.3 效果图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五 Flutter 向 Android View 获取消息


与上面发送信息不同的是,Flutter 向原生请求数据,原生返回数据到 Flutter 端

5.1 MyFlutterView onMethodCall

override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {

if (call.method == “setText”) {

val name = call.argument(“name”) as String?

val age = call.argument(“age”) as Int?

textView.text = “hello, n a m e , 年龄: name,年龄: name,年龄:age”

} else if (call.method == “getData”) {

val name = call.argument(“name”) as String?

val age = call.argument(“age”) as Int?

var map = mapOf(“name” to “hello,$name”,

“age” to “$age”

)

result.success(map)

}else {

result.notImplemented()

}

}

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤…所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
…所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!

进阶学习视频

[外链图片转存中…(img-6WFGIS2C-1714817648942)]

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-9f0dkl1i-1714817648944)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐