【问题标题】:Flutter: http get request doesn't work on apk releaseFlutter:http get 请求在 apk 版本上不起作用
【发布时间】:2021-08-30 19:55:45
【问题描述】:

关于我的问题有几个类似的问题,但所有这些问题中给出的解决方案都不适合我,所以我尝试打开另一个问题,详细说明我的问题。我希望有人可以帮助我。

背景: 我正在学习颤振和飞镖,作为初学者,我想实现一个使用 CRUD 操作的简单应用程序。我使用 REST API 访问 MongoDB 上的数据。

问题: 当我在 Web 服务器上调试我的代码作为 Web 应用程序时,它工作正常。当我尝试使用 apk 在 Android 设备上运行时,服务器似乎没有收到 https 获取请求,并且客户端阻止了负载指示器。 正如其他问题中所建议的那样,我确保在 AndroidManifest.xml 中设置了 android uses_permissions for INTERNET。* 我很确定这一点,因为用于插入数据的 post http 请求在设备上也可以正常工作。 此外,我使用 https,如下所示。

要构建 apk,我使用以下命令:

flutter build apk 

我也按照其他问题的建议尝试了这个:

flutter build apk --no-shrink

这没有帮助。

这是用于在后台获取数据的小部件 ViewStoricoRifornimenti,(如 Flutter 开发中的演示):

Future<List<Rifornimento>> fetchWelcomes(http.Client client) async {
    final response = await client.get(
      Uri.parse('https://car-statistics.herokuapp.com/rifornimenti'),
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
        'Access-Control-Allow-Origin': '*'
      },
    );

    // Use the compute function to run parsePhotos in a separate isolate.
    return compute(parseWelcomes, response.body);
  }

  List<Rifornimento> parseWelcomes(String responseBody) {
    final parsed = Welcome.fromRawJson(responseBody);
    return parsed.data;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: FutureBuilder<List<Rifornimento>>(
        future: fetchWelcomes(http.Client()),
        builder: (context, snapshot) {
          if (snapshot.hasError) print(snapshot.error);

          return snapshot.hasData
              ? StoricoRifornimenti(items: snapshot.data!)
              : Center(child: CircularProgressIndicator());
        },
      ),
    );
  }
}

这是显示结果的小部件:

class _MyHomePageState extends State<MyHomePage> {

  ViewStoricoRifornimenti vsr = new ViewStoricoRifornimenti(title: "Wow");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
      drawer: Drawer(
        child: ListView(
          padding: EdgeInsets.zero,
          children: <Widget>[
            DrawerHeader(
              decoration: BoxDecoration(
                color: Colors.blue,
              ),
              child: Text('Menu'),
            ),
            ListTile(
              title: Text('Storico Rifornimenti'),
              onTap: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => vsr),
                );
              },
            ),
          ],
        ),
      )
  }
}

我做错了吗? 为什么在 Web 应用程序上调试时我没有错误,而在设备上却无法获得 http 响应?

如何调试此类问题?

感谢大家帮助我。

【问题讨论】:

    标签: android flutter http dart


    【解决方案1】:

    确保将以下代码添加到清单中。

    首先,确保您将互联网权限添加到清单

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

    接下来确保您添加了 usesCleartextTraffic true ,这将确保您的 API 端点不安全仍然能够调用 API。

    <application
        android:usesCleartextTraffic="true">
    

    【讨论】:

    • 嗨@Jigar,感谢您的回复,但正如我上面所说,我已经确保设置了权限,并且我在https中调用API,所以我不需要明文
    【解决方案2】:

    我不得不调整 linting 设置以强制不进行隐式类型转换。 在发布版本中似乎有不同的处理方式。

    我跑了flutter pub add lints --dev 要注意我的模型类中序列化行 fromJsontoJson 中的隐式类型转换,这解决了问题。

    我开始向我的项目根目录添加一个名为 analysis_options.yaml 的文件,其内容如下:

    analyzer:
      strong-mode:
        implicit-casts: false
        implicit-dynamic: false
    

    lints 包似乎有这个甚至更多的规则。

    【讨论】:

      【解决方案3】:

      我认为您的问题是,从 Android 9 开始,您需要在 android/res/ 文件夹的 xml 目录中添加一个 network_security_config.xml 文件。

      network_security_config.xml的内容如下:

      <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">yourdomain.com</domain>
        <domain includeSubdomains="true">yourdomain2.com</domain>
      </domain-config>
      

      欲了解更多信息,请访问本文:Fix Clear Text Traffic

      并在您的 AndroidManifest.xml 文件中的标签内添加以下行:

      android:usesCleartextTraffic="true"
      android:networkSecurityConfig="@xml/network_security_config"
      

      这对我有用。如果我错了,请纠正我,并告诉我解决了你的问题。

      【讨论】:

        【解决方案4】:

        我遇到了类似的问题,我的应用在 web 上运行良好,但在 android 上运行不正常,我通过向我的 class.fromMap() 添加一个空检查来解决这个问题:

        class(id: json["id"] ?? '',);
        

        【讨论】:

          猜你喜欢
          • 2017-07-04
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 2020-02-16
          • 2016-02-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多