實現 Flutter 與 安卓的混合開發有兩種方法:
- 在安卓原生項目上使用 Flutter
- 在 Flutter 項目上調用原生 java 代碼(本次使用的方法)
dart 語言無法實現安卓底層操作,比如獲取手機電量,打開攝像頭等。這時候就有必要混合 Java 代碼實現上述功能。下面將在 Flutter 項目上調用原生 Java 代碼。
我們新建 Flutter 項目時,會自動給我們一個點擊按鈕數字增加的示例,但這是完全使用 dart 語言實現的,下面我們將把數字增加的功能交給原生 Java 代碼實現。
1 .新建 Flutter 項目,main.dart 代碼如下:
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
void main() {
runApp(MyApp());
}
//定義app整體風格
class MyApp extends StatelessWidget {
final String title = '計數器';
@override
Widget build(BuildContext context) {
return MaterialApp(
title: title,
theme: ThemeData(
primarySwatch: Colors.lightBlue,
),
home: HomePage(title: title),
);
}
}
//app主頁
class HomePage extends StatefulWidget {
final String title;
HomePage({Key key, this.title}) : super(key : key);
@override
HomePageState createState() {
return new HomePageState();
}
}
//app主頁狀態,數字增加通過原生代碼實現
class HomePageState extends State<HomePage> {
//計數器
int _counter = 0;
//定義通道,作爲通信標識符
static const platform = const MethodChannel("add");
//調用原生方法實現計數器自增
Future<Null> incrementCount() async {
int result = 0;
try {
//參數爲方法名稱
result = await platform.invokeMethod("getNumber");
} on PlatformException catch (e) {
print(e.message);
}
//獲取結果後改變界面狀態,更新界面
setState(() {
_counter = result;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
//主軸居中對齊
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('點擊按鈕次數:'),
Text(
'$_counter',
style: TextStyle(fontSize: 20.0, color: Colors.lightBlue),
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: incrementCount,
tooltip: '增加數字',
child: Icon(Icons.add),
),
);
}
}
2 .右鍵項目名——>Flutter——>在AS中打開
在 MainActivity 中編寫下面代碼:
package com.example.flutter_add_demo;
import android.os.Bundle;
import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;
public class MainActivity extends FlutterActivity {
private static final String channel = "add";
private int count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MethodChannel(getFlutterView(),channel).setMethodCallHandler(
new MethodChannel.MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
if (methodCall.method.equals("getNumber")) {
result.success(getNumber());
} else {
result.notImplemented();
}
}
}
);
GeneratedPluginRegistrant.registerWith(this);
}
//數字自增方法
private int getNumber() {
return ++count;
}
}
最後效果和官方給的示例一致,只是計數器的數字自增是通過原生 Java 代碼實現的