我有一个Flutter/GetX项目,它成功地从iOS调用了http REST API,但在Android上却无法正常工作。我的AndroidManifest.xml文件显示如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.vending_consumer">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<application
android:label="vending_consumer"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
....
</application>
</manifest>
所以这应该意味着:
- 应用程序已被授予internet访问权限
- 应用程序已启用明文http
不幸的是,REST API调用在Android上不起作用...但在iOS上运行良好。
我正在使用Flutter和GetX,因此我的提供程序类如下所示:
class ConsumerProvider extends GetConnect {
late String token;
late Map<String, String> _mainHeaders;
ConsumerProvider() {
timeout = const Duration(seconds: 30);
_mainHeaders = {
'accept': '*/*',
'Access-Control-Allow-Origin': '*',
'Access-Control-Request-Method': 'GET',
'Access-Control-Request-Headers': 'Origin, X-Requested-With, Content-Type, Accept',
};
}
@override
void onInit() {
super.onInit();
httpClient.baseUrl = 'http://localhost:7001/';
httpClient.defaultContentType = "application/json";
httpClient.timeout = const Duration(seconds: 8);
}
Future<Consumer> getConsumerByMobileNumber(String mobileNumber) async {
String url = 'enterprise/masterdata/party/consumers/byMobileNumber/$mobileNumber';
final Response response = await get(url);
if (response.status.hasError) {
debugPrint('[ConsumerProvider getConsumerByMobileNumber] status: ${response.status.code}');
debugPrint('[ConsumerProvider getConsumerByMobileNumber] response: ${response.body}');
return Future.error(response.body);
} else {
return Consumer.fromJson(response.body);
}
}
....
}
GET API返回的响应体在Android上只是null。永远不会调用服务器。但是,这在iOS上工作得很好。
好奇是否有我遗漏的其他Flutter或GetX配置?反馈是肯定赞赏。
1条答案
按热度按时间b5buobof1#
问题是在我的URL中使用“localhost”。iOS模拟器能够理解这一点,但Android模拟器却不能。一旦将“localhost”替换为“192.168.0.x”,一切都正常。