发现问题
在windows10上开发Flutter的web应用的时候,你是不是也遇到过需要指定主机名和端口号才能正常运行起来,就像下面这样:
flutter run -d chrome --target=lib/main.dart --web-port=8080 --web-hostname=127.0.0.1
但是使用mac或者Linux系统就可以不指定主机名和端口,这就......
正常来说指定就指定吧,反正Android Studio配置一下也可以一劳永逸
注意,这里有一个深坑,这里配置的主机名必须是127.0.0.1,不能是localhost,只要你配置了localhost,就会报如下的错误:
Failed to bind web development server:
SocketException: Failed to create server socket (OS Error: Failed to start accept), address = localhost, port = 8080
作为一个有经验的开发者,我们都知道,localhost就是127.0.0.1,为什么这里不能用localhost呢?不能理解。既然127.0.0.1可以正常用,那就不管那么多了,就用它。
直到有一天,有了一个特殊的场景,同事申请某第三方登录client_id的时候使用了localhost,所以,到我这就不能正常使用了,GG。
又开始跟localhost杠上了,各种查询,关闭防火墙,允许localhost流量访问啥的都试过了,还是那个醒目的错误:
Failed to bind web development server:
SocketException: Failed to create server socket (OS Error: Failed to start accept), address = localhost, port = 8080
解决问题
仔细分析了下,localhost和127.0.0.1到底有什么区别呢?为啥Windows不可以但是mac和Linux就可以呢,带着这个疑问,问了一下工具人
Windows10中的localhost默认使用了IPv6来访问主机,此时localhost就不是127.0.0.1了,所以才会一直报创建Server socket失败。这个工具人也提供了解决方案,就是禁用IPv6,默认使用IPv4访问主机就可以了,设置方式也很简单:
- 在Windows 10系统中,打开“控制面板”。
- 选择“网络和共享中心”。
- 单击左侧面板中的“更改适配器设置”。
- 找到您的网络适配器,右键单击并选择“属性”。
- 在“属性”窗口中,找到“Internet协议版本6(TCP/IPv6)”并取消选中。
- 单击“确定”以保存更改。
通过以上方式设置完以后发现其他的web应用默认不需要指定主机名和端口也可以正常打开web应用了,这才是真正的一劳永逸。
当然,如何你需要用到IPv6,那么在你不调试应用的时候再把这个选项打开就可以了。