Flutterを使用してアプリを開発すると、AndroidネイティブシステムAPIとのやり取りが発生します。
通常、Flutterを使用してページを作成し、既存のAndroidロジック(独自のSDKやサードパーティのSDKなど)を再利用して開発をスピードアップできます。進歩。
プラグインを使用して解決できる、プラグインの開発に関する公式Webサイト:
デュアルエンドプラットフォームコードの記述(プラグインの記述実装)
完全なデモは記事に一覧表示されています。
注:この例の完全な実行可能コードは、Javaで実装されたAndroidおよびObjective-C で実装されたiOSの/ examples / platform_channel /で利用できます。Swiftで実装されたiOSコードについては、/ examples / platform_channel_swift /を参照してください。
チャネル
Flutterは3つの異なるタイプのチャネルを定義します。
- BasicMessageChannel:文字列および半構造化情報を渡すために使用され、双方向でデータを要求できます。
- MethodChannel:メソッド呼び出しを渡すために使用されます(メソッド呼び出し。つまり、Flutter側はプラットフォーム側でメソッドを呼び出し、Resultインターフェースを介して結果データをコールバックできます。
- EventChannel:イベントストリームの通信に使用されます。つまり、Flutter側はプラットフォーム側でリアルタイムメッセージを監視し、プラットフォーム側がデータを生成するとすぐにFlutter側にコールバックします。
⚠️注:AndroidおよびiOSプラットフォームでは、Platform Task Runnerはメインスレッドで実行されます。したがって、時間のかかる操作は、プラットフォーム側のハンドラーで処理しないでください。
まず
、MethodChannelとEventChannelのmain.dart ファイルを次のように見てください。
class PlatformChannel extends StatefulWidget {
@override
_PlatformChannelState createState() => _PlatformChannelState();
}
class _PlatformChannelState extends State<PlatformChannel> {
static const MethodChannel methodChannel =
MethodChannel('samples.flutter.io/battery');
static const EventChannel eventChannel =
EventChannel('samples.flutter.io/charging');
String _batteryLevel = 'Battery level: unknown.';
String _chargingStatus = 'Battery status: unknown.';
Future<void> _getBatteryLevel() async {
String batteryLevel;
try {
final int result = await methodChannel.invokeMethod('getBatteryLevel');
batteryLevel = 'Battery level: $result%.';
} on PlatformException {
batteryLevel = 'Failed to get battery level.';
}
setState(() {
_batteryLevel = batteryLevel;
});
}
@override
void initState() {
super.initState();
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
}
void _onEvent(Object event) {
setState(() {
_chargingStatus =
"Battery status: ${event == 'charging' ? '' : 'dis'}charging.";
});
}
void _onError(Object error) {
setState(() {
_chargingStatus = 'Battery status: unknown.';
});
}
@override
Widget build(BuildContext context) {
return Material(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(_batteryLevel, key: const Key('Battery level label')),
Padding(
padding: const EdgeInsets.all(16.0),
child: RaisedButton(
child: const Text('Refresh'),
onPressed: _getBatteryLevel,
),
),
],
),
Text(_chargingStatus),
],
),
);
}
}
void main() {
runApp(MaterialApp(home: PlatformChannel()));
}
1. MethodChannelステップを使用する
- 定義
MethodChannel
オブジェクトを使用するメソッドを呼び出す方法をネイティブアンドロイドであってもよいです、methodChannel
invokeMethod('getBatteryLevel')
- AndroidでMethodChannelオブジェクトを定義し、そのsetMethodCallHandlerメソッドを呼び出し、コールバックインターフェイスMethodCallHandlerでonMethodCallメソッドを実装し、Resultオブジェクトを通じてFlutterエンドに値を返します。
private static final String BATTERY_CHANNEL = "samples.flutter.io/battery";
new MethodChannel(getFlutterView(), BATTERY_CHANNEL).setMethodCallHandler(
new MethodCallHandler() {
@Override
public void onMethodCall(MethodCall call, Result result) {
if (call.method.equals("getBatteryLevel")) {
int batteryLevel = getBatteryLevel();
if (batteryLevel != -1) {
result.success(batteryLevel);
} else {
result.error("UNAVAILABLE", "Battery level not available.", null);
}
} else {
result.notImplemented();
}
}
}
);
このMethodCallHandler
コールバックでは、Flutterパーツによって送信されたメソッド呼び出しリクエストが処理され、result.success(batteryLevel)
データが返されます。
これは、Android側から直接返された値を直接取得できる場合ですが、通常、Android側は非同期に動作し、インターフェースコールバックで値を返します。次に、このときにFlutter側に値を渡す方法は?その後、それを使用することができますEventChannel
。
2. EventChannelステップを使用する
- Android側でEventChannelオブジェクトを定義し、setStreamHandler()メソッドを呼び出し、匿名の内部クラスStreamHandlerでonListenメソッドとonCancelメソッドを実装し、EventSinkオブジェクトを介してデータをFlutter側に返します。
- 側によってフラッタ
eventChannel.receiveBroadcastStream().listen(_onEvent, onError: _onError);
定義する_onEvent
機能と_onError
機能処理戻り値。
new EventChannel(getFlutterView(), CHARGING_CHANNEL).setStreamHandler(
new StreamHandler() {
private BroadcastReceiver chargingStateChangeReceiver;
@Override
public void onListen(Object arguments, EventSink events) {
chargingStateChangeReceiver = createChargingStateChangeReceiver(events);
registerReceiver(
chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
}
@Override
public void onCancel(Object arguments) {
unregisterReceiver(chargingStateChangeReceiver);
chargingStateChangeReceiver = null;
}
}
);
3. BasicMessageChannelを使用する手順
Android側:
ダーツ側: