我正在遵循Flutter Networking / HTTP教程对运行在localhost:8000上的服务器进行GET请求。通过浏览器访问我的本地主机可以正常工作。当我指向任何真实的网址(例如https://example.com)时,此方法也可以正常工作,但是当我指向https://127.0.0.1:8000时,会出现类似“连接被拒绝”的错误
每次我重新加载应用程序时,上述错误中的端口都会更改。我查看了http程序包代码,似乎没有一种方法可以指定URL的端口。我如何指向我的本地主机,这是我第一次颤抖? PS:我正在手机设备上运行,我的PC和手机连接到同一wifi,我的网络是专用的。
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:http/http.dart' as http;
import 'dart:convert';
class MyHomePage extends StatefulWidget {
const MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const url = 'http://127.0.0.1:8000/api/membres/';
// static const url = 'http://10.0.2.2:8000/api/membres/';
//static const url = 'http://localhost:8000/api/membres/';
//static const url= "192.168.1...:8000/association/api/membres";
//static const url = 'https://jsonplaceholder.typicode.com/users';
Future<List<Map<String, dynamic>>> _future;
@override
void initState() {
super.initState();
_future = fetch();
}
Future<List<Map<String, dynamic>>> fetch() {
return http
.get(url)
.then((response) {
return response.statusCode == 200
? response.body
: throw 'Error when getting data';
})
.then((body) => json.decode(body))
.then((list) => (list as List).cast<Map<String, dynamic>>());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: RefreshIndicator(
onRefresh: () async {
_future = fetch();
setState(() {});
return _future;
},
child: FutureBuilder<List<Map<String, dynamic>>>(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Container(
constraints: BoxConstraints.expand(),
child: SingleChildScrollView(
physics: AlwaysScrollableScrollPhysics(),
child: Text(snapshot.error.toString()),),),);}
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);}
return ListView.builder(
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
final item = snapshot.data[index];
return ListTile(
title: Text(item['name']),
subtitle: Text(item['email']),
);
},
);
},
),
),
);
}
}
答案 0 :(得分:11)
如果您使用的是Android模拟器,则模拟器上的localhost
不是127.0.0.0
,而是10.0.2.2
,因此,在Android模拟器上,您需要编写https://10.0.2.2:8000
, https://127.0.0.1:8000
在真实设备上也无法使用。因为localhost
在实际设备上的含义有所不同。
有关如何在模拟器或真实设备上将Flutter应用程序连接到localhost
的更多信息,请单击链接Connecting Flutter application to Localhost
答案 1 :(得分:2)
您必须保持手机和计算机处于同一网络连接。
然后假设您的ip和url是这个192.168.1.102:8000
static const url= "192.168.1.102:8000/association/api/membres";
答案 2 :(得分:-1)
注意:请将您的网络设置为“家庭网络”。将网络设置为家庭网络意味着您允许PC与同一网络上的其他设备共享内容。
如果您使用的是Windows 10,可以通过以下操作完成:
打开设置 转到网络和互联网 在左侧菜单中选择WiFi 点击已连接WiFi的名称 将网络的网络配置文件设置为专用 如果您遇到问题,则最有可能与Windows防火墙有关。
打开控制面板 转到Windows Defender防火墙 点击“通过Windows Defender防火墙允许应用或功能” 检查是否已为专用网络启用了该应用程序(应该打勾) 如果未启用,请点击“更改设置”,然后选中该应用程序“私人”下的复选框