flutter - android - http.get 在发布模式下永远不会返回

Rap*_*aël 7 android http flutter

我正在为 android 和 ios 编写一个 flutter 应用程序。要登录,该应用程序使用http 包(版本 0.12.2)http.Response response = await http.get(url);:。在 iOS 中,一切正常。在 Android 中,调试模式也可以正常工作,但是,如果我构建 apk 并从此版本 apk 安装应用程序,则异步方法 http.get 永远不会返回。我在 OnePlus 3 (OxygenOS 9.0.6) 上使用 Android 9。

我对扑动很陌生,无法弄清楚这一点。github 上有一个类似的问题,但涉及到 web 的 flutter。

这是要重现的最小代码。要测试它,您应该构建 apk(构建 > Flutter > 构建 apk)),将 apk 复制并粘贴到手机文件中,从 apk 安装应用程序,按下按钮PRESS MEdone将永远不会显示。

  • 主程序.dart
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Test flutter'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  
  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _status = "Press the button";

  void _test() async {
    String url = "http://dummy.restapiexample.com/api/v1/employees";

    // Send HTTP request to the server
    http.Response response = await http.get(
        url
    );

    setState(() {
      _status = "done";
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            // Test button
            RaisedButton(
                onPressed: _test,
                child: Text(
                  "PRESS ME",
                ),
              ),
            Text(
              '$_status',
            ),
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)
  • pubspec.yaml
name: flutter_test_app
description: Test app for reproducing minimal example

publish_to: 'none' # Remove this line if you wish to publish to pub.dev

version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter
  http: ^0.12.2

  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true
Run Code Online (Sandbox Code Playgroud)

小智 4

您好,您需要向 AndroidManifest.xml 添加网络权限,请查看有关 flutter 网络的官方文档 https://flutter.dev/docs/development/data-and-backend/networking

它位于 android/src/main/AndroidManifest.xml

<manifest xmlns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET" />
 <application ...
</manifest>
Run Code Online (Sandbox Code Playgroud)