Flutter 与原生态平台互动也是必须的

lxf2023-12-17 08:10:01

Flutter 是一个快速开发高品质、性能卓越移动应用程序框架。与传统移动应用程序开发方法不一样,Flutter 是由应用单一代码库来建立应用软件的。可是,对于一些必须浏览机器设备最底层硬件配置或使用原生态服务平台特定功能性的状况,Flutter 与原生态平台互动也是必须的。本文详细介绍 Flutter 编码如何跟原生态平台互动,包含启用原生代码和接收原生代码传参的办法。

原生代码启用

Flutter 与原生态平台互动的一种方式是由启用原生代码。Flutter 提供了一个 MethodChannel 类来建立与原生代码的通讯。开发者还可以在 Flutter 应用软件中创建一个 MethodChannel,并通过它去启用原生态平台上的方式。下列是一个应用 MethodChannel 启用原生态服务平台方式的事例:

import 'package:flutter/services.dart'; 
// 创建一个 MethodChannel 目标,安全通道名称是 "example.channel"
final channel = MethodChannel('example.channel');
// 启用原生态服务平台方式
try { final result = await channel.invokeMethod('getBatteryLevel');
// 解决原生态服务平台传参
} on PlatformException catch(e) {
// 解决启用原生态服务平台方式时发生错误
}

在后面的编码中,创建了一个名叫 example.channel 的 MethodChannel 目标。应用 invokeMethod 方式来启用原生态平台上的方式 getBatteryLevel。启用结束后,将传参保存在自变量 result 中。

为了能让 Flutter 应用软件可以启用原生代码,开发者必须在原生态平台上实现一个对应的方式,并把它申请注册到 Flutter 应用软件中。下列是一个在 Android 软件上完成 getBatteryLevel 方式的事例:

import android.content.Context
import android.content.ContextWrapper
import android.content.Intent
import android.content.IntentFilter
import android.os.BatteryManager
import android.os.Build
import android.os.Bundle
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "example.channel"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        GeneratedPluginRegistrant.registerWith(this)

        MethodChannel(flutterView, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "getBatteryLevel") {
                val batteryLevel = getBatteryLevel()

                if (batteryLevel != -1) {
                    result.success(batteryLevel)
                } else {
                    result.error("UNAVAILABLE", "Battery level not available.", null)
                }
            } else {
                result.notImplemented()
            }
        }
    }

    private fun getBatteryLevel(): Int {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
            batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
        } else {
            val intent = ContextWrapper(applicationContext).registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
            val level = intent!!.getIntExtra(BatteryManager.EXTRA_LEVEL, -1)
            val scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1)
            if (level == -1 || scale == -1) {
                -1
            } else {
                (level * 100 / scale.toFloat()).toInt()
            }
        }
    }
}

这个案例演示了怎样在原生态 Android 软件上完成一个名为 getBatteryLevel 的办法,并把它曝露给 Flutter 应用软件。用这种方法用以获得机器设备电池容量,它建立与设备上 Android 版本号相关。Flutter 应用软件可以用 MethodChannel 类启用这种方法从而获取其传参。

原生代码传参

与原生态平台互动时,Flutter 应用软件不但可以启用原生代码,还能够接受原生代码的传参。MethodChannel 提供了一个 invokeMethod 方式,此方法回到一个 Future 目标,用以在原生态服务平台方法调用结束后接受传参。

下列是一个事例,演试怎样在 Flutter 应用软件中接受原生态服务平台方式的传参:

final channel = MethodChannel('example.channel');
try {
  final result = await channel.invokeMethod('getDeviceInfo');
  print(result);
} on PlatformException catch (e) {
  print(e.message);
}

在后面的编码中,大家启用了名叫 getDeviceInfo 的原生方式,并用 await 等候传参。假如启用取得成功,传参将保存在自变量 result 中。不然,将抛出去一个 PlatformException 出现异常。

在原生态平台上完成 getDeviceInfo 步骤如下:

private fun getDeviceInfo():Map<String, String> {
    val deviceInfo=HashMap<String, String>()
        deviceInfo["model"]=Build.MODEL 
        deviceInfo["manufacturer"]=Build.MANUFACTURER 
        deviceInfo["version"]=Build.VERSION.RELEASE 
        return deviceInfo

} 

在这样一个例子中,大家重新定义了一个 getDeviceInfo 方式,此方法回到一个 Map 目标,其中包括机器的一些信息。在 Flutter 应用软件中启用这种方法时,这将回到一个包括设备标识的 Map 目标。Flutter 应用软件可以用这些数据来进行一定的解决。

汇总

在本文,大家阐述了 Flutter 如何跟原生态平台互动,包含启用原生代码和接收原生代码传参的办法。根据使用 MethodChannel 类,大家能够轻松的在 Flutter 应用软件中启用原生态服务平台方式,并接受传参。从而为开发者提供了一种在 Flutter 应用软件中应用原生态服务平台特殊功能性的方式。如果你是一个 Flutter 开发人员,希望你能够从本文得到协助,并迅速从你应用程序中应用原生态服务功能。

本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!