新建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. Docker 0x05: Dockerfile制作镜像

    目录 Dockerfile制作镜像 一句话什么是dockerfile dockerfile脚本指令 小结 Dockerfile制作镜像 dockerfile 可以是制作自己镜像的脚本文件,按照这个脚本 ...

  2. H3C CSMA/CA

  3. [Doxygen].Docygen使用

    转自:https://www.cnblogs.com/chenyang920/p/5732643.html Doxygen是一种开源跨平台的,以类似JavaDoc风格描述的文档系统,可以从一套归档源文 ...

  4. React源码 React ref

    ref 的功能,在 react 当中.我们写了一个组件,在这个时候,我们的 render function 里面我们会渲染一系列的子组件或者 dom 节点,有时候我们会希望有这样的需求,就是我们要获取 ...

  5. HTTP权威指南 目录

    diyi部分 HTTP:Web的基础 第1章 HTTP概述 31.1 HTTP——因特网的多媒体信使 41.2 Web客户端和服务器 41.3 资源 51.3.1 媒体类型 61.3.2 URI 71 ...

  6. Nginx是什么及作用?

    一:介绍 nginx是一个高性能的HTTP和反向代理服务器,其特点是占用内存少,并发能力强. 二:名词介绍 代理服务器: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络 ...

  7. Cronicle 基于nodejs 的分布式任务调度工具

    Cronicle 是一款不多的分布式任务调度工具,基于nodejs 开发,同时包含看web UI,从官方介绍看到的UI还是 挺不错的,而且功能很丰富,值得试用下 参考资料 http://cronicl ...

  8. presto-gateway lyft 团队开源的prestodb 的负载均衡、代理、网关工具

    presto-gateway 是 lyft 团队开源 的prestodb 的工具,很方便,我们可以用来方便的管理presto 多集群 通过yaml 进行配置管理,可以方便的管理不同的集群 lyft 参 ...

  9. 洛谷p2330繁忙的都市题解

    题面 根据题意来分析, 要求出你选了几条路, 最小生成树是能解的, 那么就直接输出n - 1条路即可, 至于最大值则走一遍最小生成树求出即可 这里提供最小生成树的两种方法 1. 克鲁斯卡尔 克鲁斯卡尔 ...

  10. Java GUI 的基础学习

    Java Swing的学习: 重点理解容器类(Container)和组件类(Component): Java把component类的子类或间接子类创建的对象称为一个组件 Java把Container的 ...