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);
}