下面我们通过一个获取电池电量的插件来介绍一下Flutter插件的开发流程。该插件中我们在Dart中通过getBatteryLevel 调用Android BatteryManager API和iOS device.batteryLevel API

创建一个新的应用程序项目

  1. flutter create -a kotlin -i swift batterylevel
  • 创建一个新的 Android代码模板的应用程序,在终端中运行 ```json

    支持使用Java编写Android代码模板

    flutter create -a java batterylevel

支持使用Kotlin编写Android代码模板

flutter create -a kotlin batterylevel

  1. 创建一个新的 **IOS代码模板** 的应用程序,在终端中运行
  2. ```json
  3. #支持使用swift编写ios代码模板
  4. flutter create -i swift batterylevel
  5. #支持使用Objective-C编写ios代码模板
  6. flutter create -i objective-c batterylevel

默认情况下,,或使用Objective-C编写iOS代码。
要使用Kotlin或Swift,请使用-i和/或-a标志,在终端中运行

创建Flutter平台客户端

该应用的 State 类拥有当前的应用状态。我们需要延长这一点以保持当前的电量
首先,我们构建通道。我们使用 MethodChannel 调用一个方法来返回电池电量。
通道的客户端和宿主通过通道构造函数中传递的通道名称进行连接。单个应用中使用的所有通道名称必须是唯一的; 我们建议在通道名称前加一个唯一的“域名前缀”,例如 samples.flutter.io/battery

  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/services.dart';
  4. ...
  5. class _MyHomePageState extends State<MyHomePage> {
  6. static const platform = const MethodChannel('samples.flutter.io/battery');
  7. // Get battery level.
  8. }

接下来,我们调用通道上的方法,指定通过字符串标识符调用方法getBatteryLevel。 该调用可能失败(平台不支持平台API,例如在模拟器中运行时),所以我们将invokeMethod调用包装在try-catch语句中。
我们使用返回的结果,在setState中来更新用户界面状态batteryLevel。

  1. // Get battery level.
  2. String _batteryLevel = 'Unknown battery level.';
  3. Future<Null> _getBatteryLevel() async {
  4. String batteryLevel;
  5. try {
  6. final int result = await platform.invokeMethod('getBatteryLevel');
  7. batteryLevel = 'Battery level at $result % .';
  8. } on PlatformException catch (e) {
  9. batteryLevel = "Failed to get battery level: '${e.message}'.";
  10. }
  11. setState(() {
  12. _batteryLevel = batteryLevel;
  13. });
  14. }

最后,我们在build创建包含一个小字体显示电池状态和一个用于刷新值的按钮的用户界面。

@override
Widget build(BuildContext context) {
  return new Material(
    child: new Center(
      child: new Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        children: [
          new RaisedButton(
            child: new Text('Get Battery Level'),
            onPressed: _getBatteryLevel,
          ),
          new Text(_batteryLevel),
        ],
      ),
    ),
  );
}

至此Flutter部分的测试代码写好了,接下来我们需要实现Android和iOS平台下的API,由于平台API实现部分篇幅较大,我们将在接下来的两节中,分别介绍Android和iOS端API的实现。

完整代码

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'dart:async';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}


class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);
  @override
  _MyHomePageState createState() => _MyHomePageState();
}


class _MyHomePageState extends State<MyHomePage> {
  static const platform = const MethodChannel('samples.flutter.io/battery');
// Get battery level.
  String _batteryLevel = 'Unknown battery level.';

  Future<Null> _getBatteryLevel() async {
    String batteryLevel;
    try {
      final int result = await platform.invokeMethod('getBatteryLevel');
      batteryLevel = 'Battery level at $result % .';
    } on PlatformException catch (e) {
      batteryLevel = "Failed to get battery level: '${e.message}'.";
    }
    setState(() {
      _batteryLevel = batteryLevel;
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Material(
      child: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            new RaisedButton(
              child: new Text('Get Battery Level'),
              onPressed: _getBatteryLevel,
            ),
            new Text(_batteryLevel),
          ],
        ),
      ),
    );
  }
  // Get battery level.
}