笔记:开发Android插件

220 阅读2分钟

上一篇文章笔记:Android页面嵌入flutter页面 如何通信的使用场景我们主app是Android项目,就是说只是在Android项目中嵌入部分flutter代码,我觉得这也是目前使用的比较多的混合开发模式。

这篇文章介绍的开发Android插件的使用场景是我们的主app是flutter,但是在开发的时候有一些平台相关的功能需要原生来提供

步骤:

选择Flutter Plugin

完成后:

里面的sample文件夹是一个独立的项目,里面使用了flutter_plugin2这个插件

这个插件演示了如何获取系统版本信息,我们在自定义插件时可以参考它的实现。

我们看下Android端的代码:

然而什么也看不到,我也不知道为啥? 我们切换到Package视图下:

主要就是参考下这两个类是怎么实现的

具体实现

获取系统Cache路径

package com.example.flutter_plugin

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
import io.flutter.plugin.common.PluginRegistry.Registrar

class FlutterPlugin(registrar: PluginRegistry.Registrar) :MethodChannel.MethodCallHandler {
  private var mRegistrar: PluginRegistry.Registrar? = registrar

  companion object {
    @JvmStatic
    fun registerWith(registrar: PluginRegistry.Registrar) {
      val channel = MethodChannel(registrar.messenger(), "com.flutter.cache_path")
      val instance = FlutterPlugin(registrar)
      channel.setMethodCallHandler(instance)
    }
  }

  override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
    if (call.method == "getCachePath") {
      result.success(getCacheDir())

    } else {
      result.notImplemented()
    }
  }

  private fun getCacheDir(): String {

    //需要context  怎么办?
    return mRegistrar!!.context().cacheDir.path
  }
}

import 'dart:async';

import 'package:flutter/services.dart';

class FlutterPlugin {
  static const MethodChannel _channel =
  const MethodChannel('com.flutter.cache_path');

  static Future<String> get platformCacheDir async {
    final String version = await _channel.invokeMethod('getCachePath');
    return version;
  }
}

看下example中是怎么使用的?

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

import 'package:flutter/services.dart';
import 'package:flutter_plugin2/flutter_plugin2.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 FlutterPlugin.platformCacheDir;
    } 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'),
        ),
      ),
    );
  }
}