首页 > 解决方案 > Dart http 包在内置 apk 中不起作用

问题描述

我正在开发一个需要发出 http 请求的 Flutter 应用程序。我像往常一样安装了 http 包,但是当需要在真实设备中测试应用程序时,http 请求挂起,我从来没有得到响应或状态码。然后我决定启动一个新应用程序只是为了搞乱 http 包,但我仍然遇到了同样的问题。

这是我在 Android Emulator 中调试时得到的结果(我几乎立即得到响应)这是我在真实设备上得到的结果(永远挂起)。

我已经尝试过的可能解决方案:构建签名和未签名的apk,在构建apk之前运行flutter clean,使用--no-shrinkflag构建apk,更改pubspec.yaml中http包的版本,这些似乎都没有解决问题。

我正在使用最新稳定版本的 Flutter SDK (v1.17.5)、Android Studio 进行编码,并使用 Ubuntu 20.04 作为操作系统。

这是我的飞镖代码:

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

class AuthScreen extends StatefulWidget {
  @override
  _AuthScreenState createState() => _AuthScreenState();
}

class _AuthScreenState extends State<AuthScreen> {
  final TextEditingController _urlController = TextEditingController();
  String _status = 'Waiting for request';

  void _submit() async {
    setState(() {
      _status = 'Waiting for response...';
    });
    var response = await http.get(_urlController.text);
    if (response.statusCode == 200) {
      setState(() {
        _status = response.body.substring(0, 40) + ' [...]';
      });
    } else {
      _status = 'Something went wrong';
    }
  }

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextFormField(
              controller: _urlController,
            ),
            FlatButton(
              child: Text('Send request'),
              onPressed: _submit,
            ),
            Text(_status)
          ],
        ),
      ),
    );
  }
}

这是我的 pubspec.yaml,以防它有用:

name: testingHttpPackage
description: A new Flutter application.

publish_to: 'none'

version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  http: ^0.12.1
  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

标签: flutterdart

解决方案


您是否在文件中提到了互联网许可AndroidManifest.xml?在android/app/src/main/ 中,有AndroidManifest.xml 文件,将下面的行放在manifest 标签之后,即在第一个标签之后。

 <uses-permission android:name="android.permission.INTERNET" />   

推荐阅读