返回

为 Flutter 添加 Go 的力量:Go-Flutter 通信之道的艺术

前端

Go-Flutter 中的消息传递

在 Go-Flutter 中,Go 和 Dart 世界之间的数据交换是通过消息传递机制实现的。消息以二进制格式发送,使用名为 "platform" 的专用通道,该通道同时存在于 Go 和 Dart 代码中。

Go 端向 Dart 端发送消息

要从 Go 端向 Dart 端发送消息,我们使用 platform.Publish 方法。这个方法接受两个参数:

  • 频道名称: Dart 端监听消息的频道名称。
  • 消息: 要发送的二进制消息。
package main

import (
	"encoding/binary"
	"log"

	"github.com/go-flutter-desktop/go-flutter"
)

func main() {
	engine := gflutter.NewEngine()
	gflutter.MessagePlugin(engine).Send("my_channel", 12345)
}

Dart 端监听消息

在 Dart 端,我们使用 MethodChannel 监听来自 Go 的消息。MethodChannel 允许 Flutter 和原生代码之间进行异步通信。

import 'package:flutter/services.dart';

void main() {
  const channel = MethodChannel('my_channel');
  channel.setMethodCallHandler((MethodCall call) {
    switch (call.method) {
      case 'my_method':
        final message = call.arguments;
        // ... process message
    }
  });
}

实战示例

为了更好地理解 Go-Flutter 通信,让我们创建一个示例,在 Go 端生成一个随机数并将其发送到 Dart 端。

Go 端代码:

package main

import (
	"encoding/binary"
	"log"
	"math/rand"
	"time"

	"github.com/go-flutter-desktop/go-flutter"
)

func main() {
	engine := gflutter.NewEngine()
	gflutter.MessagePlugin(engine).Send("random_number", randomNumber())
}

func randomNumber() int64 {
	rand.Seed(time.Now().UnixNano())
	return int64(rand.Int31n(1000000))
}

Dart 端代码:

import 'package:flutter/services.dart';

void main() {
  const channel = MethodChannel('random_number');
  channel.setMethodCallHandler((MethodCall call) {
    switch (call.method) {
      case 'get_random_number':
        final message = call.arguments;
        final randomNumber = binary.BigEndian.decodeUint64(message);
        // ... display randomNumber
    }
  });
}

结论

通过掌握 Go-Flutter 中的消息传递机制,您可以轻松地将 Go 的强大功能集成到您的 Flutter 应用程序中。这种跨语言通信的艺术为您的开发工作流程开辟了新的可能性,让您能够构建更加强大和灵活的应用程序。