}

override fun dispose() {

TODO(“Not yet implemented”)

}

}

2.3 设置返回的View为TextView

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

val textView: TextView = TextView(context)

init {

textView.text = “我是Android View”

}

override fun getView(): View {

return textView

}

override fun dispose() {

TODO(“Not yet implemented”)

}

}

说明:

  • messenger:用于消息传递,后面介绍 Flutter 与 原生通信时用到此参数

  • viewId:View 生成时会分配一个唯一 ID

  • args:Flutter 传递的初始化参数

2.4 注册PlatformView

创建PlatformViewFactory

class MyFlutterViewFactory(val messenger: BinaryMessenger) : PlatformViewFactory(StandardMessageCodec.INSTANCE) {

override fun create(context: Context, viewId: Int, args: Any?): PlatformView {

val flutterView = MyFlutterView(context, messenger, viewId, args as Map<String, Any>?)

return flutterView

}

}

创建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 {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一线互联网面试专题

379页的Android进阶知识大全

379页的Android进阶知识大全

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节

还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

[外链图片转存中…(img-UMNHakdH-1712759612807)]

[外链图片转存中…(img-i3mVYUWf-1712759612808)]

[外链图片转存中…(img-ve2HblEG-1712759612808)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

Logo

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

更多推荐