Flutter出aar

journey

Flutter是一个跨平台的移动应用开发框架,使用Dart语言编写,能够快速构建高性能、精美的移动应用。然而,有时候我们可能需要将Flutter项目打包成aar文件,以便在原生Android项目中使用。本文将介绍如何使用Flutter打包aar文件的方法,并提供相应的代码示例。

准备工作

在开始之前,请确保你已经安装了Flutter SDK,并且可以成功运行Flutter项目。如果还没有安装Flutter SDK,可以参考Flutter的官方文档进行安装。

构建Flutter模块

首先,我们需要创建一个Flutter模块,这个模块将作为最终生成aar文件的基础。使用以下命令创建一个新的Flutter模块:

flutter create my_flutter_module
cd my_flutter_module

接下来,可以编辑lib/main.dart文件来编写Flutter应用的逻辑。这里我们以一个简单的示例来说明:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Module',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Module'),
        ),
        body: Center(
          child: Text(
            'Hello, Flutter!',
            style: TextStyle(fontSize: 24),
          ),
        ),
      ),
    );
  }
}

以上代码创建了一个简单的Flutter应用,其中包含一个标题为"Flutter Module"的顶部导航栏和一个居中显示的文本"Hello, Flutter!"。

构建Android插件

接下来,我们将创建一个Android插件,用于将Flutter模块打包成aar文件。首先,在Flutter模块的根目录下创建一个新的Android Library项目:

flutter create -t plugin my_flutter_plugin
cd my_flutter_plugin

然后,编辑android/src/main/kotlin/com/example/myflutterplugin/MyFlutterPlugin.kt文件,编写Flutter与原生Android的交互逻辑:

package com.example.myflutterplugin

import android.content.Context
import androidx.annotation.NonNull
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.embedding.engine.FlutterEngineGroup
import io.flutter.embedding.engine.dart.DartExecutor.DartCallback
import io.flutter.embedding.engine.loader.FlutterLoader
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

class MyFlutterPlugin private constructor(private val context: Context) : MethodCallHandler {
    private var engine: FlutterEngine? = null
    private var channel: MethodChannel? = null

    override fun onMethodCall(call: MethodCall, result: Result) {
        if (call.method == "startFlutterModule") {
            startFlutterModule(call.argument("initialRoute"), result)
        } else {
            result.notImplemented()
        }
    }

    private fun startFlutterModule(initialRoute: String?, result: Result) {
        val flutterLoader = FlutterLoader()
        flutterLoader.startInitialization(context)
        flutterLoader.ensureInitializationComplete(context, null)

        val engineGroup = FlutterEngineGroup(context)
        engine = engineGroup.createAndRunEngine(context)

        channel = MethodChannel(engine?.dartExecutor?.binaryMessenger, "my_flutter_plugin")
        channel?.setMethodCallHandler(this)

        val dartCallback = DartCallback(context.assets, "main")
        engine?.dartExecutor?.executeDartCallback(dartCallback)

        val route = initialRoute ?: "/"
        engine?.navigationChannel?.pushRoute(route)

        result.success(null)
    }

    companion object {
        @JvmStatic
        fun registerWith(registrar: Registrar) {
            val channel = MethodChannel(registrar.messenger(), "my_flutter_plugin")
            channel.setMethodCallHandler(MyFlutterPlugin(registrar.context()))
        }
    }
}

以上代码创建了一个名为MyFlutterPlugin的类,该类实现了MethodCallHandler接口,并通过MethodChannel实现了Flutter与原生Android的通信。其中,startFlutterModule方法用于启动Flutter模块,registerWith方法用于注册插件。

接下来,编辑android/src/main/AndroidManifest.xml文件,添加权限和插件声明:

<manifest xmlns:android="
    package="com.example.myflutter