Flutter Plugin开发简单示例
新建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开发简单示例的更多相关文章
- Flutter Plugin开发流程
这篇文章主要介绍了Flutter Plugin开发流程,包括如何利用Android Studio开发以及发布等. 本文主要给大家介绍如何开发Flutter Plugin中Android的部分.有关Fl ...
- Android学习笔记—Windows下NDK开发简单示例
该示例假设Android开发环境已经搭建完成,NDK也配置成功: 1.在Eclipse上新建Android工程,名称为ndkdemo.修改res\layout\activity_main.xml &l ...
- thrift服务端到客户端开发简单示例
(1)首先我们在服务器端写个helloworld.thrift文件,如下所示: service HelloWorld{ string ping(1: string name), string getp ...
- 2017.2.20 activiti实战--第二章--搭建Activiti开发环境及简单示例(二)简单示例
学习资料:<Activiti实战> 第一章 搭建Activiti开发环境及简单示例 2.5 简单流程图及其执行过程 (1)leave.bpmn 后缀名必须是bpmn.安装了activiti ...
- [xfire]使用xfire开发webservice的简单示例
目前项目上有用到xfire,所以临时看了些xfire的资料和示例,自己照着写了一个简单示例. xfire在2007年后已经停止更新,正式更名为apache cxf,也可以说是xfire2.0. xfi ...
- Flutter实战:手把手教你写Flutter Plugin
前言 如果你对移动端有所关注,那么你一定会听说过Flutter.得益于Google,Flutter一经推出便得受到了广泛关注.很多开发者跃跃欲试,国内部分大厂,诸如美团.闲鱼等团队已经开始了Flutt ...
- 【Flutter 混合开发】嵌入原生View-Android
Flutter 混合开发系列 包含如下: 嵌入原生View-Android 嵌入原生View-IOS 与原生通信-MethodChannel 与原生通信-BasicMessageChannel 与原生 ...
- 开发简单的Kafka应用
之前基于集群和单机安装过kafka,现在利用kafka提供的API构建一个简单的生产者消费者的项目示例,来跑通kafka的流程,具体过程如下: 首先使用eclipse for javaee建立一个ma ...
- HTML-003-模拟IDE代码展开收起功能简单示例
当先我们在日常的编程开发工作中使用编程工具(例如 Eclipse.Sublime 等等)都有相应的代码折叠展开功能,如下图所示,极大的方便了我们的编码工作.
随机推荐
- 使用Js将页面打印或保存为Pdf
很久没有写前端的文章了,今天就来说说js一个比较方便的功能,打印当前页面或保存成pdf吧. js有一个原生的函数,print(),顾名思义就是打印.但是有时候我们需要打印页面某些部分,所以需要对页面进 ...
- Shell 编程 条件语句
本篇主要写一些shell脚本条件语句的使用. 条件测试 test 条件表达式 [ 条件表达式 ] 文件测试 -d:测试是否为目录(Directory). -e:测试文件或目录是否存在(Exist). ...
- tensorflow批量读取数据
Tensorflow 数据读取有三种方式: Preloaded data: 预加载数据,在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况). Feeding: Pyt ...
- Django之ORM数据查询方式练习
单表查询 单表查询简单示例 # 字段 models.DateField(auto_now_add) models.DateField(auto_now) # auto_now 和auto_now_ad ...
- jmeter 实现登录参数化
业务场景 在测试过程中,一般需要模拟不同的用户登录,这样压测的数据比较平均,也能更好的模拟真实的压力情况. 如果使用同一个用户账号进行测试,那么比如在查询代办的时候,此人的待办太多,也不符合实际的情况 ...
- centos下导入mysql数据库
先进入mysql1.mysql -u root -p2.输入密码3.use 要导入的数据库名(没有就新建一个,使用create database test;命令新建,再use test;,再set n ...
- The 2016 ACM-ICPC Asia China-Final D. Ice Cream Tower 二分 + 贪心
题目大意: 对于给出的n个冰激凌球的大小,满足下面的球的大小是上一个的至少2倍,对于给出的k(由k的冰激凌球才能算作一个冰激凌塔),问n个冰激凌球可以最多堆出多少个高度为k的冰激凌塔 题目分析: 对于 ...
- pandas的行列显示不全的解决方法
pd.set_option('display.max_rows', 100) # 显示的最大行数(避免只显示部分行数据) pd.set_option('display.max_columns', 10 ...
- 项目Beta冲刺(团队6/7)
项目Beta冲刺(团队) --6/7 作业要求: 项目Beta冲刺(团队) 1.团队信息 团队名 :男上加男 成员信息 : 队员学号 队员姓名 个人博客地址 备注 221600427 Alicesft ...
- flask实战-个人博客-使用工厂函数创建程序实例 --
使用工厂函数创建程序实例 使用蓝本还有一个重要的好处,那就是允许使用工厂函数来创建程序实例.在OOP(Object-Oriented Programming,面向对象编程)中,工厂(factory)是 ...