摘要

我有一个使用WebSockets的程序,该程序在debug模式下功能齐全,但在release模式下运行相同的exact代码会导致错误.

语境

Flutter 文档教会我们how to work with WebSockets个.

让我们使用official代码示例来处理WebSockets(我对它进行了一些修改,以在Text小部件中显示错误):

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

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(Build语境 context) {
    const title = 'WebSocket Demo';
    return const MaterialApp(
      title: title,
      home: MyHomePage(
        title: title,
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
    required this.title,
  });

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();
  final _channel = WebSocketChannel.connect(
    Uri.parse('wss://echo.websocket.events'),
  );

  @override
  Widget build(Build语境 context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Padding(
        padding: const EdgeInsets.all(20.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Form(
              child: TextFormField(
                controller: _controller,
                decoration: const InputDecoration(labelText: 'Send a message'),
              ),
            ),
            const SizedBox(height: 24),
            StreamBuilder(
              stream: _channel.stream,
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  return Text(snapshot.data.toString());
                } else if (snapshot.hasError) {
                  return Text(snapshot.error.toString());
                } else {
                  return const Text('listening...');
                }
              },
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _sendMessage,
        tooltip: 'Send message',
        child: const Icon(Icons.send),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }

  void _sendMessage() {
    if (_controller.text.isNotEmpty) {
      _channel.sink.add(_controller.text);
    }
  }

  @override
  void dispose() {
    _channel.sink.close();
    _controller.dispose();
    super.dispose();
  }
}

问题

如果在调试模式下在MacOS上运行上述代码片段,它将正常工作.但是,如果您使用flutter build macos构建应用程序,您将收到以下错误:

SocketException: Failed host lookup: ‘...’ (OS Error: nodename nor servname provided, or not known, errno = 8)

enter image description here

我所try 的

  1. SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) with flutter app on macOS个 上面说要加上这个 <key>com.apple.security.network.client</key> <true/>

  2. SocketException: Failed host lookup: ‘...com’ (OS Error: nodename nor servname provided, or not known, errno = 8)

  3. ssh: Could not resolve hostname [hostname]: nodename nor servname provided, or not known

  4. 关闭了我的防火墙.

  5. 已确保有活动的互联网连接.

问题

Why does the above snippet work in Debug mode, but not in release mode when running 100?

Note

正在运行

flutter doctor -v

显示"未发现问题".

推荐答案

您说它可以在调试模式下运行,但不能在发布模式下运行,所以我怀疑您已经将授权添加到了调试配置文件中,但您可能忘记了将其添加到发布配置文件中.

macos>;Runner目录下,找到"DebugProfile.Entiments"和"Release.Entiments"文件:

folder structure screenshot

将此部分添加到两个文件中:

<key>com.apple.security.network.client</key>
<true/>

Flutter相关问答推荐

使用Flutter 提供程序包加载状态应用程序时,在自定义按钮中显示CircularProgressIndicator

允许冻结在初始化时使用工厂

在fltter_widget_from_html中启动url

Flutter -如何停止块监听程序在后台堆栈中运行

从外部类动态更改IconButton的图标

Flutter API请求BadState响应

在选项卡栏视图中搜索和筛选不起作用

如何修改来自合并 list 的 Android list 权限?

点击按钮后重新启动定时器

提供者、存储库和服务之间有什么区别?

使用 riverpod 提供 GoRouter 实例的正确方法是什么?

使用 Riverpod 和 copyWith 方法更新数据类中列表中变量的值

如何显示从 MariaDB 获取的数据到列表视图

对话框打开时如何使背景模糊?

如何扫描来自给定链接或按钮的重定向中的所有 URL?

Getx Flutter 在更新值时抛出空错误

Banner Ad.test 广告单元 ID 是否已过时?

如何在Flutter 中水平滚动堆叠定位的小部件?

参数类型Future>不能分配给参数类型Future>?

用于空值 FirebaseFirestore 的空值判断运算符