Flutter进阶—简单平台插件实例
在之前写过的《Flutter进阶—平台插件》中,笔者简单介绍了如何简单的使用和创建一个Flutter插件,现在可以试试编写一个可以在平台与客户端之间传递数据的Flutter平台插件。在此之前,可以先了解一下平台插件的基本原理。 上面图片是平台通道的结构概述,使用 标准平台通道使用的是标准消息编解码器,支持简单高效的将JSON格式的值二进制序列化,例如布尔值、数字、字符串、字节缓冲区以及这些数据的列表和映射,具体可以查看StandardMessageCodec类。发送和接收值时,会自动对这些值进行序列化和反序列化。下面的表格展示了在平台端如何接收Dart值,反之亦然。
了解完原理之后,可以通过idea编辑器创建一个新的Flutter项目,名称为 Flutter部分首先,需要创建Flutter平台客户端,构建通道,使用具有基本传递数据功能的单平台方法的 import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
//...
class _MyHomePageState extends State<MyHomePage> {
static const platform = const MethodChannel('samples.flutter.test/plugin');
//...
}
接下来在 class _MyHomePageState extends State<MyHomePage> {
static const platform = const MethodChannel('samples.flutter.test/plugin');
String _returnData = '';
Future<Null> _dataInteraction() async {
String returnData;
try {
final int result = await platform.invokeMethod('dataInteraction');
returnData = '平台返回数据:$result';
} on PlatformException catch (e) {
returnData = '错误信息:${e.message}';
}
setState((){
_returnData = returnData;
});
}
//...
}
最后将模板中的 class _MyHomePageState extends State<MyHomePage> {
//...
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(widget.title),),body: new Center(
child: new Text('${_returnData}'),floatingActionButton: new FloatingActionButton(
onPressed: _dataInteraction,tooltip: '获取平台数据',child: new Icon(Icons.autorenew),);
}
}
Android部分在编写完Flutter部分的代码之后,使用Java编写Android平台特定的实现代码。为了插件的稳定性,在这里使用Java和Objective-C代码,如果喜欢也可以使用Kotlin和Swift的。首先在Android Studio中打开Flutter项目的Android主机部分,具体操作如下:
接下来,创建一个 package com.yourcompany.testplugin;
import android.os.Bundle;
import java.util.Random;
import io.flutter.app.FlutterActivity;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "samples.flutter.test/plugin";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MethodChannel(getFlutterView(),CHANNEL).setMethodCallHandler(new MethodCallHandler(){
@Override
public void onMethodCall(MethodCall call,Result result){
}
});
GeneratedPluginRegistrant.registerWith(this);
}
}
然后编写Java代码,用于调用Android上的随机函数,这跟在Android项目上编写的代码完全一样。在 public class MainActivity extends FlutterActivity {
//...
@Override
public void onMethodCall(MethodCall call,Result result){
}
private int getData() {
Random ran = new Random();
return ran.nextInt(1000);
}
}
最后,在完成了之前添加的 原代码:
public void onMethodCall(MethodCall call,Result result){
}
修改代码:
public void onMethodCall(MethodCall call,Result result){
if(call.method.equals("dataInteraction")) {
int data = getData();
result.success(data);
}else{
result.notImplemented();
}
}
现在就能够在Android上运行应用程序了,点击右下方的按钮就能获取Android主机返回的随机数字。 iOS部分在确定Android主机与Flutter客户端沟通正常后,在Xcode中打开Flutter项目中的iOS主机部分:
接下来,创建一个 #include "AppDelegate.h"
#include "GeneratedPluginRegistrant.h"
#import <Flutter/Flutter.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GeneratedPluginRegistrant registerWithRegistry:self];
// Override point for customization after application launch.
FlutterViewController* controller = (FlutterViewController*)self.window.rootViewController;
FlutterMethodChannel* batteryChannel = [FlutterMethodChannel
methodChannelWithName:@"samples.flutter.test/plugin"
binaryMessenger:controller];
[batteryChannel setMethodCallHandler:^(FlutterMethodCall* call,FlutterResult result) {
}];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end
接下来,使用ObjectiveC代码添加获取随机数的功能,这段代码与在本机iOS应用程序中编写的代码完全相同。在 - (int)getData {
int ran = arc4random() % 1000;
return ran;
}
@end
最后,在完成了之前添加的 [batteryChannel setMethodCallHandler:^(FlutterMethodCall* call,FlutterResult result) {
if ([@"dataInteraction" isEqualToString:call.method]) {
int data = [self getData];
result (@(data));
} else {
result(FlutterMethodNotImplemented);
}
}];
现在就能够在iOS上运行应用程序了,点击右下方的按钮就能获取iOS主机返回的随机数字。 通过完成前面的例子可以看出,平台插件的实现其实很简单。只要把上面例子的getData方便修改成想要实现的平台特定功能,就能实现对应的平台插件,比如官方插件教程中就实现了通过特定平台API获取电池电量。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |