FlutterとAndroidネイティブの混合開発-EventChannelとMethodChannelの使用

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オブジェクトを使用するメソッドを呼び出す方法をネイティブアンドロイドであってもよいです、methodChannelinvokeMethod('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側:
ここに画像の説明を挿入
ダーツ側:

ここに画像の説明を挿入

リファレンス:
FlutterプラットフォームチャネルFlutterプラットフォームチャネル
の詳細な理解

元の記事82件を公開 86のような 110,000以上

おすすめ

転載: blog.csdn.net/unicorn97/article/details/102463153