当前位置: 首页 > news >正文

济南城乡建设网站海南电商网站建设

济南城乡建设网站,海南电商网站建设,建设兼职网站目的,wordpress 获取指定分类文章目录 app效果native和flutter通信的基础知识1. 编解码器 一致性和完整性,安全性,性能优化2. android代码3. dart代码 1. 创建flutter_module2.修改 Android 项目的 settings.gradle,添加 Flutter module3. 在 Android app 的 build.gradl…

文章目录

        • app效果
        • native和flutter通信的基础知识
          • 1. 编解码器 一致性和完整性,安全性,性能优化
          • 2. android代码
          • 3. dart代码
        • 1. 创建flutter_module
        • 2.修改 Android 项目的 settings.gradle,添加 Flutter module
        • 3. 在 Android app 的 build.gradle 中添加依赖
        • 4. 原生和flutter_module通信BasePlugin
        • 5. io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister 自动注册插件
        • 6 手动注册
        • 7. 通信关闭flutter页面
        • 8. dartEntrypointArgs传入参数
        • 9. 通信传入参数
          • 9.1 发送参数
          • 9.1 接收参数
        • 10. android代码
        • 11 源码

app效果
在这里插入图片描述
native和flutter通信的基础知识

低级的消息通道,一般不直接使用
ServicesBinding.instance.defaultBinaryMessenger
高级别的消息通道,对defaultBinaryMessenger进行了封装,提供的更简单的api发送和接收消息
BasicMessageChannel MethodChannel EventChannel
MethodChannel EventChannel底层都是基于BasicMessageChannel

1. 编解码器 一致性和完整性,安全性,性能优化

MethodChannel,EventChannel->StandardMethodCodec
BasicMessageChannel->StandardMessageCodec
StandardMessageCodec:支持基本的数据类型(字符串、数字、布尔值、字节数组、列表、映射等)。
StandardMethodCodec:除了支持基本的数据类型外,还支持方法调用的参数和返回结果的编码和解码。
StringCodec:由于只处理字符串,StringCodec 的实现更为简单,性能更高

2. android代码
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {basicMessageChannel = BasicMessageChannel(flutterEngine.dartExecutor.binaryMessenger, BASIC_CHANNEL, StringCodec.INSTANCE)//创建MethodChannelmethodChannel =MethodChannel(flutterEngine.dartExecutor, BASIC_CHANNEL, StandardMethodCodec.INSTANCE)//创建EventChanneleventChannel = EventChannel(flutterEngine.dartExecutor, BASIC_CHANNEL)basicMessageChannel.send("dddd")basicMessageChannel.setMessageHandler { message, reply ->reply.reply("dddd")Log.e("dddd", message.toString())}methodChannel.invokeMethod("getPlatformVersion", null)methodChannel.setMethodCallHandler { call, result ->when (call.method) {"getPlatformVersion" -> {result.success("Android ${android.os.Build.VERSION.RELEASE}")}else -> {result.notImplemented()}}}eventChannel.setStreamHandler(object : EventChannel.StreamHandler {override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {eventSink = eventseventSink?.success("Event")}override fun onCancel(arguments: Any?) {eventSink = null}})}
3. dart代码
class _StudyChannelState extends State<StudyChannel> {MethodChannel methodChannel = const MethodChannel('base_plugin');EventChannel eventChannel = const EventChannel('base_plugin');static const basicMessageChannel = BasicMessageChannel<String>('base_plugin', StringCodec());  void initState() {super.initState();//只接收eventChannel.receiveBroadcastStream().listen((value){});//监听methodChannel.setMethodCallHandler((call){call.method == "getData" ? print("getData") : print("method=$call");return Future.value("methodChannel=$call");});//执行,相当于发送methodChannel.invokeListMethod("getData");//发送basicMessageChannel.send("data");//监听basicMessageChannel.setMessageHandler((message){return Future.value("basicMessageChannel=$message");});}Widget build(BuildContext context) {return const Placeholder();}
}
1. 创建flutter_module

File->New->New Flutter Project
name为flutter_module
选择project type为module

2.修改 Android 项目的 settings.gradle,添加 Flutter module
pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.google.*")includeGroupByRegex("androidx.*")}}mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)repositories {google()mavenCentral()maven(url = "https://storage.googleapis.com/download.flutter.io")}
}rootProject.name = "hunheandroid"
include(":app")
//主要是这一句
apply(from = "../flutter_module/.android/include_flutter.groovy")
3. 在 Android app 的 build.gradle 中添加依赖
dependencies {implementation(project(":flutter"))
}
4. 原生和flutter_module通信BasePlugin

参考文章生成对应的io/flutter/plugins/Messages.g.kt
用pigeon kotlin swift写一个自己的插件
拷贝BasePlugin

package io.flutter.pluginsimport android.app.Activity
import android.util.Log
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin
import io.flutter.embedding.engine.plugins.activity.ActivityAware
import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding/** BasePlugin */
/** BasePlugin */
class BasePlugin : FlutterPlugin, HostMessageApi, ActivityAware {companion object {private var flutterMessageApi: FlutterMessageApi? = nullfun getFlutterMessageApi(): FlutterMessageApi? {return flutterMessageApi}}private var activity: Activity? = nullprivate var tag = "BasePlugin"override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {Log.e(tag, "onAttachedToEngine-start")HostMessageApi.setUp(flutterPluginBinding.binaryMessenger, this)flutterMessageApi = FlutterMessageApi(flutterPluginBinding.binaryMessenger)Log.e(tag, "onAttachedToEngine-end")}override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {HostMessageApi.setUp(binding.binaryMessenger, null)}override fun flutter2Native(message: String, type: Long): String {print("flutter2Native=message=start=>$message=type=$type")return "flutter2Native=message=$message=type=$type"}override fun flutter2NativeAsync(message: String,type: Long,callback: (Result<String>) -> Unit) {print("flutter2NativeAsync=message=$message=type=$type")callback(Result.success("flutter2NativeAsync=message=$message=type=$type"))if (type == 1L) {closeCurrentActivity()}}private fun closeCurrentActivity() {activity?.finish()}override fun onAttachedToActivity(binding: ActivityPluginBinding) {this.activity = binding.activity}override fun onDetachedFromActivityForConfigChanges() {}override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {}override fun onDetachedFromActivity() {this.activity = null}
}
5. io.flutter.embedding.engine.plugins.util.GeneratedPluginRegister 自动注册插件
 public static void registerGeneratedPlugins(@NonNull FlutterEngine flutterEngine) {try {Class<?> generatedPluginRegistrant =Class.forName("io.flutter.plugins.GeneratedPluginRegistrant");Method registrationMethod =generatedPluginRegistrant.getDeclaredMethod("registerWith", FlutterEngine.class);registrationMethod.invoke(null, flutterEngine);} catch (Exception e) {Log.e(TAG,"Tried to automatically register plugins with FlutterEngine ("+ flutterEngine+ ") but could not find or invoke the GeneratedPluginRegistrant.");Log.e(TAG, "Received exception while registering", e);}}
package io.flutter.plugins;import androidx.annotation.Keep;
import androidx.annotation.NonNull;
import io.flutter.Log;import io.flutter.embedding.engine.FlutterEngine;/*** Generated file. Do not edit.* This file is generated by the Flutter tool based on the* plugins that support the Android platform.*/
@Keep
public final class GeneratedPluginRegistrant {private static final String TAG = "GeneratedPluginRegistrant";public static void registerWith(@NonNull FlutterEngine flutterEngine) {try {Log.e(TAG, "registerWith-start");flutterEngine.getPlugins().add(new BasePlugin());Log.e(TAG, "registerWith-end");} catch (Exception e) {Log.e(TAG, "Error registering plugin base_plugin, com.app.base_plugin.BasePlugin", e);}}
}
6 手动注册

flutterEngine.getPlugins().add(new BasePlugin());

7. 通信关闭flutter页面

使用flutter和原生通信,在收到消息以后,关闭当前页面
BasePlugin实现ActivityAware,获取到activity
在收到flutter传入进来的消息的时候关闭activity

8. dartEntrypointArgs传入参数
//跳转带入参数
val initialRoute = listOf(  "aaa","bbbb")startActivity(withNewEngine().dartEntrypointArgs(initialRoute)  .build(this))
//args就是传入的参数
void main(List<String> args){print("args=$args");runApp(const MyApp());
}
9. 通信传入参数
9.1 发送参数
 val initialRoute = listOf(  "/page2","bbbb")BasePlugin.getFlutterMessageApi()?.native2Flutter(initialRoute.joinToString("#"), 1){Log.e(tag, "flutter2NativeAsync: $it")FlutterLibrary.startFlutterPage(this)}
9.1 接收参数

class RouterPage extends StatefulWidget {const RouterPage({super.key});State<RouterPage> createState() => _RouterPageState();
}class _RouterPageState extends State<RouterPage> implements FlutterMessageApi {late String args;void initState() {super.initState();FlutterMessageApi.setUp(this);}String native2Flutter(String message, int type) {print("native2Flutter=$message $type");setState(() {args = message;});return "我是原生调用flutter方法返回的值=》native2Flutter";}Future<String> native2FlutterAsync(String message, int type) {args = message;print("native2Flutter=$message $type");return Future.value("我是原生调用flutter方法返回的值=》native2FlutterAsync");}Widget build(BuildContext context) {// final value = widget.args.isNotEmpty ? widget.args[0] : "/";if (args.isEmpty||!args.contains("#")) {return MyHomePage(title: "首页");}final value = args.split("#").first;switch (value) {case '/page2':return SecondPage();}print("_RouterPageState=build");return MyHomePage(title: "首页");}
}class MyHomePage extends StatefulWidget {const MyHomePage({super.key, required this.title});final String title;State<MyHomePage> createState() => _MyHomePageState();
}class _MyHomePageState extends State<MyHomePage>  {int _counter = 0;void _incrementCounter() {setState(() {_counter++;});}void initState() {super.initState();}Widget build(BuildContext context) {print("_MyHomePageState=build");return Scaffold(appBar: AppBar(title: Text(widget.title), leading: BackButton()),body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: <Widget>[TextButton(onPressed: () {BasePlugin.flutter2NativeAsync("flutter2NativeAsync", 1).then((value,) {print("flutter2NativeAsync=$value");});},child: Text('flutter2NativeAsync'),),TextButton(onPressed: () {Navigator.of(context).pushNamed("/page2");},child: Text('flutter2NativeAsync'),),const Text('You have pushed the button this many times:'),Text('$_counter',style: Theme.of(context).textTheme.headlineMedium,),],),),floatingActionButton: FloatingActionButton(onPressed: _incrementCounter,tooltip: 'Increment',child: const Icon(Icons.add),), // This trailing comma makes auto-formatting nicer for build methods.);}}class SecondPage extends StatelessWidget {const SecondPage({super.key});Widget build(BuildContext context) {print("SecondPage=build");return Scaffold(appBar: AppBar(title: Text("SecondPage")),body: Center(child: TextButton(onPressed: () {Navigator.of(context).pop();},child: Text('关闭'),),),);}
}
10. android代码
package com.example.hunheandroidimport android.app.Application
import android.content.Context
import android.content.Intent
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.FlutterEngineCache
import io.flutter.embedding.engine.FlutterEngineGroup
import io.flutter.embedding.engine.dart.DartExecutor
import io.flutter.plugins.BasePluginconst val ENGINE_ID = "my_engine_id"
object FlutterLibrary {fun init(application: Application) {FlutterEngineManager.getInstance().init(application)}fun startFlutterPage(context: Context) {val intent = FlutterActivity.withCachedEngine(ENGINE_ID).build(context).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)context.startActivity(intent)}
}// FlutterEngineManager.kt
class FlutterEngineManager private constructor() {private lateinit var engineGroup: FlutterEngineGroupprivate var engine: FlutterEngine? = nullcompanion object {private var instance: FlutterEngineManager? = nullfun getInstance(): FlutterEngineManager {return instance ?: synchronized(this) {instance ?: FlutterEngineManager().also { instance = it }}}}fun init(application: Application) {engineGroup = FlutterEngineGroup(application)engine = engineGroup.createAndRunEngine(application,DartExecutor.DartEntrypoint.createDefault())FlutterEngineCache.getInstance().put(ENGINE_ID, engine)engine!!.plugins.add(BasePlugin())}fun getEngine(): FlutterEngine? {return engine}fun destroyEngine() {engine?.destroy()engine = null}
}class GoFlutterActivity : FlutterActivity(), HostMessageApi {private val tag = "GoFlutterActivity"private lateinit var binding: ActivityGoFlutterBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ActivityGoFlutterBinding.inflate(layoutInflater)setContentView(binding.root)binding.goFlutter.setOnClickListener {//跳转到flutterval initialRoute = listOf(  // Map 形式的参数"/","aaaa")BasePlugin.getFlutterMessageApi()?.native2Flutter(initialRoute.joinToString("#"), 1) {Log.e(tag, "flutter2NativeAsync: $it")FlutterLibrary.startFlutterPage(this)}}binding.goFlutter2.setOnClickListener {//跳转到flutterval initialRoute = listOf(  // Map 形式的参数"/page2","bbbb")BasePlugin.getFlutterMessageApi()?.native2Flutter(initialRoute.joinToString("#"), 1) {Log.e(tag, "flutter2NativeAsync: $it")FlutterLibrary.startFlutterPage(this)}}}override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {Log.e(tag, "configureFlutterEngine")
//        GeneratedPluginRegistrant.registerWith(flutterEngine)}override fun flutter2Native(message: String, type: Long): String {Log.e(tag, "$message$type")return "我是flutter调用原生方法的返回值=》flutter2Native"}override fun flutter2NativeAsync(message: String,type: Long,callback: (Result<String>) -> Unit) {Log.e(tag, "$message$type")callback(Result.success("我是flutter调用原生方法的返回值=》flutter2NativeAsync"))}}
11 源码

gitee

http://www.dtcms.com/a/522268.html

相关文章:

  • 石家庄制作网站推广管家婆免费资料网站
  • 美仑美家具的网站谁做的如何分析竞争对手网站
  • 企业网站 php 免费wordpress 文章最长
  • 新开传奇网站发布站手游电子工程师有前途吗
  • php网站开发练手项目做红酒的网站有哪些
  • 借贷网站建设方案wordpress 动态筛选
  • 雄安做网站要多少钱秦皇岛微信群
  • 腾讯企点qtrade做移动网站优化快
  • 大气婚纱影楼网站织梦模板世界互联网峰会乌镇
  • wordpress 总站模板文艺范wordpress主题
  • 做网站租用服务器青岛网络推广
  • 专业手机网站建设哪家好wordpress建电商网站
  • 电商网站订货龙岗网络推广
  • 国外优质设计网站无锡网络公司官网
  • 彩票网站开发周期给别人做ppt的网站
  • 杭州网站建设哪家权威公司代理记账企业
  • 烟台微信网站建设千锋教育培训收费一览表
  • 深圳做网站建设月薪多少wordpress next page
  • 网站的版式找国外客户的网站
  • 网站域名会赠送几个邮箱琼海网站制作
  • 成都公司网站建设程序编程软件有哪些
  • 珠海网站建设兼职wordpress图床推荐
  • 安徽建站优化哪里有建设网站申请书
  • 手机做网站河北城乡建设官网站
  • 怎么给自己喜欢的人做网站商城网站设计企业
  • 网站建设属于销售费用html常用标签代码大全
  • 福州网站制作公司营销wordpress排行榜模板
  • 网站模块介绍wordpress 开发 主题授权
  • 网站联系我们的地图怎么做建站行业的利润
  • 先做它个天猫网站温州哪里有做网站