widget init/deinit 代码在 Flutter 中的位置
Where to put widget init/deinit code in Flutter
我正在构建一个小部件,用于侦听网络上的 UDP 数据包,然后相应地更新子小部件。
我不确定将套接字的初始化代码放在哪里。当我将调用放入 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: [
]));
}
}
我不知道您的代码中发生了什么。但如果它在 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);
}
我正在构建一个小部件,用于侦听网络上的 UDP 数据包,然后相应地更新子小部件。
我不确定将套接字的初始化代码放在哪里。当我将调用放入 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: [
]));
}
}
我不知道您的代码中发生了什么。但如果它在 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);
}