我正在構建一個小部件,用于偵聽網路上的 UDP 資料包,然后相應地更新子小部件。
我不確定將套接字的初始化代碼放在哪里。當我將呼叫放入 build() 函式時它可以作業,但我認為這是不正確的,因為 build 會被多次呼叫。
我曾嘗試創建一個 initState 方法,但它從未被呼叫。
任何指標?
謝謝
import 'dart:io';
import 'dart:convert';
import 'package:flutter/material.dart';
void connectAndListen() {
int port = 3001;
// listen forever
RawDatagramSocket.bind(InternetAddress.anyIPv4, port).then((socket) {
socket.listen((RawSocketEvent event) {
if (event == RawSocketEvent.read) {
Datagram? dg = socket.receive();
if (dg == null) return;
final recvd = String.fromCharCodes(dg.data);
/// send ack to anyone who sends ping
if (recvd == "ping") socket.send(Utf8Codec().encode("ping ack"), dg.address, port);
print("$recvd from ${dg.address.address}:${dg.port}");
}
});
});
print("udp listening on $port");
}
@override
Widget build(BuildContext context) {
connectAndListen();
return Scaffold(
appBar: AppBar(
title: const Text('Level Details'),
),
body: Column(children: [
]));
}
}
uj5u.com熱心網友回復:
我不知道您的代碼中發生了什么。但如果它在內部作業build(肯定會被多次呼叫),你也可以在 initState 中使用它,但在微任務佇列中。
@override
void initState() {
super.initState();
// Call your method from microtask queue. This will only get called once.
Future.microtask(() {
connectAndListen();
});
// Or better:
Future.microtask(connectAndListen);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/475866.html
下一篇:具有多個套接字的UDP網路
