Flutter通信插件antenna的使用

Flutter通信插件antenna的使用

特性

声明你的各种事件

你可以列出应用中将要发生的各种事件。

实现你的小型存储

你可以单独存储特定模型的当前状态。

拦截副作用

你应该在改变状态之前完成所有涉及副作用的工作。

在一定时间内保持你的存储和效果

你还可以指定你的存储和效果何时开始或停止监听事件。

入门指南

首先,在你的 pubspec.yaml 文件中添加 antenna 插件:

flutter pub add antenna

使用方法

声明你的各种事件
const increment = "increment";
实现你的小型存储
final counterStore = createStore<int>(({
  int state = 0,
  dynamic event,
}) {
  if (event == increment) {
    return state + 1;
  }

  if (event == decrement) {
    return state - 1;
  }

  if (event is SetNumber) {
    return event.value;
  }

  return state;
});
拦截副作用
void setRandomNumberEffect(dynamic event) {
  if (event == random) {
    final value = Random().nextInt(100);

    dispatch(SetNumber(value));
  }
}
在一定时间内保持你的存储和效果
final subscription = connect(counterStore);

final subscription = listen(setRandomNumberEffect);
使用Antenna管理器控制订阅的生命周期
class _MyCounterState extends State<MyCounter> with AntennaManager {
  [@override](/user/override)
  void initState() {
    $connect(counterStore);

    $listen(setRandomNumberEffect);

    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            StoreConsumer(
              store: counterStore,
              builder: (context, data) => Text(data.toString()),
            ),
            TextButton(
              onPressed: () => dispatch(increment),
              child: const Text("Increment"),
            ),
            TextButton(
              onPressed: () => dispatch(decrement),
              child: const Text("Decrement"),
            ),
            TextButton(
              onPressed: () => dispatch(random),
              child: const Text("Random"),
            ),
          ],
        ),
      ),
    );
  }
}

完整示例Demo

example/lib/main.dart

import 'dart:math';

import 'package:antenna/antenna.dart';
import 'package:flutter/material.dart';

// 定义事件
const increment = "increment";
const decrement = "decrement";
const random = "random";

// 定义存储
final counterStore = createStore<int>(({
  int state = 0,
  dynamic event,
}) {
  if (event == increment) {
    return state + 1;
  }

  if (event == decrement) {
    return state - 1;
  }

  if (event == random) {
    final value = Random().nextInt(100);
    dispatch(SetNumber(value));
    return state;
  }

  return state;
});

// 定义副作用
void setRandomNumberEffect(dynamic event) {
  if (event == random) {
    final value = Random().nextInt(100);

    dispatch(SetNumber(value));
  }
}

// 主界面
class MyCounter extends StatefulWidget {
  const MyCounter({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyCounter> createState() => _MyCounterState();
}

class _MyCounterState extends State<MyCounter> with AntennaManager {
  [@override](/user/override)
  void initState() {
    $connect(counterStore);
    $listen(setRandomNumberEffect);

    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            StoreConsumer(
              store: counterStore,
              builder: (context, data) => Text(data.toString()),
            ),
            TextButton(
              onPressed: () => dispatch(increment),
              child: const Text("Increment"),
            ),
            TextButton(
              onPressed: () => dispatch(decrement),
              child: const Text("Decrement"),
            ),
            TextButton(
              onPressed: () => dispatch(random),
              child: const Text("Random"),
            ),
          ],
        ),
      ),
    );
  }
}

void main() => runApp(const MaterialApp(home: MyCounter()));

更多关于Flutter通信插件antenna的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter通信插件antenna的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


Antenna 是一个用于 Flutter 的通信插件,主要用于在 Flutter 应用与原生平台(如 Android 和 iOS)之间进行通信。它提供了一种简单的方式来发送和接收消息,并且支持异步操作。

以下是如何在 Flutter 项目中使用 Antenna 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 antenna 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  antenna: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装依赖。

2. 创建通信通道

在 Flutter 中,你需要创建一个 Antenna 实例来与原生平台通信。

import 'package:antenna/antenna.dart';

final antenna = Antenna('com.example.myapp/channel');

这里的 'com.example.myapp/channel' 是通道名称,你需要确保在原生代码中使用相同的名称。

3. 发送消息到原生平台

你可以使用 antenna.send 方法向原生平台发送消息,并接收响应。

void sendMessage() async {
  try {
    final response = await antenna.send('Hello from Flutter');
    print('Response from native: $response');
  } catch (e) {
    print('Error: $e');
  }
}

4. 在原生平台接收消息

你需要在原生代码中设置一个 MethodChannel 来接收来自 Flutter 的消息。

Android

MainActivity.kt 文件中:

import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity: FlutterActivity() {
    private val CHANNEL = "com.example.myapp/channel"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "Hello from Flutter") {
                // 处理消息
                result.success("Hello from Android")
            } else {
                result.notImplemented()
            }
        }
    }
}

iOS

AppDelegate.swift 文件中:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: "com.example.myapp/channel",
                                           binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
            if call.method == "Hello from Flutter" {
                // 处理消息
                result("Hello from iOS")
            } else {
                result(FlutterMethodNotImplemented)
            }
        })

        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

5. 从原生平台发送消息到 Flutter

你也可以从原生平台向 Flutter 发送消息。在 Flutter 中,你需要设置一个监听器来接收这些消息。

void receiveMessage() {
  antenna.receive((message) {
    print('Received message from native: $message');
  });
}

6. 在原生平台发送消息

Android

MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).invokeMethod("sendMessage", "Hello from Android")

iOS

channel.invokeMethod("sendMessage", arguments: "Hello from iOS")

7. 处理错误

在 Flutter 中,你可以捕获和处理通信过程中可能发生的错误。

try {
  final response = await antenna.send('Hello from Flutter');
  print('Response from native: $response');
} catch (e) {
  print('Error: $e');
}
回到顶部