mcpField
F
flutter-native

flutter-native

github.com/dhruvanbhalara開発30247 回インストール8 週間前に更新
リポジトリ

flutter-native について

Flutter から Android や iOS のネイティブコードと保守性・型安全性を保って連携するためのスキルです。チャネル、Pigeon、コード構成、プラグイン設計を扱います。

主な機能

  1. 01MethodChannel による要求と応答
  2. 02EventChannel によるストリーム転送
  3. 03Pigeon による型安全な API
  4. 04プラットフォーム別コードの構成
  5. 05フェデレーテッドプラグインの構成

活用シーン

  1. 01Dart からネイティブ API を呼び出す
  2. 02センサーや接続状態のデータを転送する
  3. 03再利用可能なクロスプラットフォームプラグインを設計する

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/dhruvanbhalara/skills --skill flutter-native

インストール後、Claude Code で/flutter-nativeを入力して読み込まれたか確認します。

詳細

ネイティブプラットフォーム相互運用性

Flutter アプリの開発では、多くの場合、基盤となるネイティブプラットフォーム (Android/iOS) と直接通信する必要があります。このスキルでは、保守しやすく型安全な相互運用性のための標準について説明します。

1. MethodChannel (単発)

Dart とネイティブ間の標準的なリクエスト・レスポンスパターンには MethodChannel を使用します。

Dart 標準
  • 一意のドメイン形式のチャネル名を使用します。
  • 呼び出しは必ず try-catch で囲み、PlatformException を処理します。
static const _channel = MethodChannel('com.example.app/device_info');

Future<String?> getDeviceOS() async {
  try {
    return await _channel.invokeMethod<String>('getOS');
  } on PlatformException catch (e) {
    AppLogger.error('Failed to get OS', error: e);
    return null;
  }
}

2. EventChannel (ストリーム)

継続的なデータフロー (例: センサーデータ、接続状態) には EventChannel を使用します。

実装
  • ネイティブ側は onListen と onCancel を必ず処理する必要があります。
  • Dart 側はリークを防ぐためにサブスクリプションを必ず dispose する必要があります。

3. Pigeon による型安全性

複雑な API では、手動による文字列ベースのキーを避けます。型安全なインターフェースを生成するには Pigeon を使用します。

4. プラットフォーム固有のディレクトリ構造

可能であれば、ネイティブコードは関連する機能内に整理するか、共有ロジック用に専用の plugins/ ディレクトリを使用します。

5. Swift Package Manager (SPM) のデフォルト化

Flutter 3.44 で導入

  • iOS/macOS のネイティブ統合では、SPM がデフォルトのパッケージマネージャーです。新しい構成では CocoaPods を完全に置き換えます。
  • プラグインの pubspec.yaml で swift_packages フィールドを使用して Swift パッケージを直接宣言するか、Xcode ワークスペースを介して直接構成します (flutter-spm を参照)。

6. Platform View の大幅な刷新

Flutter 3.44 で導入

  • 埋め込みネイティブビュー (マップ、Web ビュー、カメラなど) は、フレーム落ちを最小限に抑え、UI コンポジットのパフォーマンス問題を解消するために、刷新されたハイブリッドコンポジションレンダリングパイプラインを使用します。

7. フェデレーテッドプラグイン

ロジックが複数のアプリで再利用可能な場合:

  • 実装を _platform_interface、_android、_ios、_web パッケージに分割します。
  • ユーザー向けに単一のエントリポイントを提供します。

コメント