新建Plugin项目:

flutter create --template=plugin -i swift -a javahello
  • lib/hello.dart:

    • 插件包的Dart API.
  • android/src/main/java/com/yourcompany/​hello/HelloPlugin.java:
    • 插件包API的Android实现.
  • ios/Classes/HelloPlugin.m:
    • 插件包API的ios实现.
  • example/:
    • 一个依赖于该插件的Flutter应用程序,来说明如何使用它

用AS打开:

编写Android 插件包:

package com.example.hello;

import android.app.Service;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Vibrator; import java.util.HashMap;
import java.util.Map; 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;
import io.flutter.plugin.common.PluginRegistry.Registrar; /** HelloPlugin */
public class HelloPlugin implements MethodCallHandler {
static Context applicationContext;
/** Plugin registration. */
public static void registerWith(Registrar registrar) {
applicationContext=registrar.context();
final MethodChannel channel = new MethodChannel(registrar.messenger(), "hello");
channel.setMethodCallHandler(new HelloPlugin()); } @Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getPlatformVersion")) {
result.success("Android " + android.os.Build.VERSION.RELEASE);
} else if (call.method.equals("PackageInfo")){ try {
//获取APP相关信息
PackageManager pm = applicationContext.getPackageManager();
PackageInfo info = pm.getPackageInfo(applicationContext.getPackageName(), 0);
Map<String, String> map = new HashMap<>();
map.put("appName", info.applicationInfo.loadLabel(pm).toString());
map.put("packageName", applicationContext.getPackageName());
map.put("version", info.versionName); map.put("buildNumber", info.versionCode+""); result.success(map); } catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
result.error("Name not found", e.getMessage(), null);
} } else if (call.method.equals("Vibrate")){
// 震动
Vibrator vib = (Vibrator) applicationContext.getSystemService(Service.VIBRATOR_SERVICE);
vib.vibrate(500);
result.success(null);
} else {
result.notImplemented();
}
} }

编写hello.dart

import 'dart:async';

import 'package:flutter/services.dart';

class Hello {
static const MethodChannel _channel = const MethodChannel('hello'); static Future<String> get platformVersion async {
final String version = await _channel.invokeMethod('getPlatformVersion');
return version;
} static Future<PackageInfo> get packageInfo async {
final Map<dynamic, dynamic> map = await _channel.invokeMethod('PackageInfo'); PackageInfo _packageInfo = PackageInfo(
map["appName"],
map["packageName"],
map["version"],
map["buildNumber"],
);
return _packageInfo;
}
static void get vibrate {
_channel.invokeMethod('Vibrate');
}
} class PackageInfo {
String appName;
String packageName;
String version;
String buildNumber; PackageInfo(this.appName, this.packageName, this.version, this.buildNumber);
}

在example下使用:

pubspec.yaml引入:

name: hello_example
description: Demonstrates how to use the hello plugin.
publish_to: 'none' environment:
sdk: ">=2.1.0 <3.0.0" dependencies:
flutter:
sdk: flutter dev_dependencies:
flutter_test:
sdk: flutter hello:
path: ../

main.dart调用:

import 'package:flutter/material.dart';
import 'dart:async'; import 'package:flutter/services.dart';
import 'package:hello/hello.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
} class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown'; @override
void initState() {
super.initState();
initPlatformState();
} // Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
String platformVersion;
// Platform messages may fail, so we use a try/catch PlatformException.
try {
platformVersion = await Hello.platformVersion;
PackageInfo packageInfo = await Hello.packageInfo;
print(packageInfo.appName);
print(packageInfo.packageName);
print(packageInfo.version);
print(packageInfo.buildNumber);
Hello.vibrate;
} on PlatformException {
platformVersion = 'Failed to get platform version.';
} // If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return; setState(() {
_platformVersion = platformVersion;
});
} @override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Plugin example app'),
),
body: Center(
child: Text('Running on: $_platformVersion\n'),
),
),
);
}
}

一个简单的插件就开发完毕了,只支持Android,IOS平台先略过哈,后期可以发布pub就可以供其他人使用了!

真机测试通过,日志如下

参考文档:https://flutterchina.club/developing-packages/

Flutter Plugin开发简单示例的更多相关文章

  1. Flutter Plugin开发流程

    这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...

  2. Android学习笔记—Windows下NDK开发简单示例

    该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...

  3. thrift服务端到客户端开发简单示例

    (1)首先我们在服务器端写个helloworld.thrift文件,如下所示: service HelloWorld{ string ping(1: string name), string getp ...

  4. 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(二)简单示例

    学习资料:<Activiti实战> 第一章 搭建Activiti开发环境及简单示例 2.5 简单流程图及其执行过程 (1)leave.bpmn 后缀名必须是bpmn.安装了activiti ...

  5. [xfire]使用xfire开发webservice的简单示例

    目前项目上有用到xfire,所以临时看了些xfire的资料和示例,自己照着写了一个简单示例. xfire在2007年后已经停止更新,正式更名为apache cxf,也可以说是xfire2.0. xfi ...

  6. Flutter实战:手把手教你写Flutter Plugin

    前言 如果你对移动端有所关注,那么你一定会听说过Flutter.得益于Google,Flutter一经推出便得受到了广泛关注.很多开发者跃跃欲试,国内部分大厂,诸如美团.闲鱼等团队已经开始了Flutt ...

  7. 【Flutter 混合开发】嵌入原生View-Android

    Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...

  8. 开发简单的Kafka应用

    之前基于集群和单机安装过kafka,现在利用kafka提供的API构建一个简单的生产者消费者的项目示例,来跑通kafka的流程,具体过程如下: 首先使用eclipse for javaee建立一个ma ...

  9. HTML-003-模拟IDE代码展开收起功能简单示例

    当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作.

随机推荐

  1. java.io.IOException: Premature EOF

    http访问第三方系统的接口时,小概率抛出下面的异常: java.io.IOException: Premature EOF at sun.net.www.http.ChunkedInputStrea ...

  2. 【解决】k8s 1.15.2 镜像下载方案

    k8s 国内镜像下载方案 众所周知,国内是不太容易下载k8s.gcr.io站点的镜像的 一.第一种方案:Azure中国镜像站 http://mirror.azure.cn/help/gcr-proxy ...

  3. Socket网络编程-SocketServer

    Socket网络编程-SocketServer 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.SocketServer概述 socket编程过于底层,编程虽然有套路,但是想要写 ...

  4. 性能测试基础---LR关联

    ·什么时候需要做关联?一般来说,在脚本运行出错的时候,我们就可能需要进行关联处理. ·脚本出错分为两种情况: ·直接回放出错(失败).通常来说,如果录制成功,回放失败,排除数据的唯一性约束之后,那就必 ...

  5. 2019年牛客多校第四场 B题xor(线段树+线性基交)

    题目链接 传送门 题意 给你\(n\)个基底,求\([l,r]\)内的每个基底是否都能异或出\(x\). 思路 线性基交板子题,但是一直没看懂咋求,先偷一份咖啡鸡板子写篇博客吧~ 线性基交学习博客:传 ...

  6. Java 执行

    java -cp****.jar ****.****.className [args] linux 下 -cp 参数使用 : 分割 一般都是 .:lib/* windows 下使用 ; 分割

  7. angularJS开发环境搭建和启动

    本文目录:1.angularJS框架简介 2.angularJS环境搭建 3.启动一个项目 1.angularJS框架简介 AngularJS是一个开发动态Web应用的框架.它让你可以使用HTML作为 ...

  8. scala 型变

    型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性. Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的. 在类型系统中使用型变允许我们在 ...

  9. 面试15--strcmp,strcpy,memmove实现

    一. strcmp strcmp是用于比较两个字符串的大小的.   int strcmp( const char *string1, const char *string2 ) char *strin ...

  10. 在WinDbg中显示和搜索std::map内容

    我们希望在WinDbg中自动显示.搜索和过滤std::map对象.std::vectors的脚本相对简单,因为vectors中数据的平面结构:map是更复杂的野兽.具体地说,Visual C++ ST ...