如果将图像连接到协议为HTTPS的地址,则一切正常。
final String _path = 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg';
如果您将图像连接到协议为HTTP的地址,那么一切都不起作用。
final String _path = 'http://fr38060s.bget.ru/_html/perform/img/car.jpg';
以前,这个问题是通过这种方式解决的。在文件中,在应用程序 AndroidManifest.xml标记中,添加了该属性
android:usesCleartextTraffic="true"
现在,如果您单击链接,一切都会有所不同
我在android/app/src/main/res文件夹中创建了xml文件夹
在其中创建了一个network-security-config.xml文件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
在AndroidManifest.xml添加
android:networkSecurityConfig="@xml/network-security-config"
这是完整的代码
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.f1">
<application
android:networkSecurityConfig="@xml/network-security-config"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:label="f1">
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:exported="true"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
主要.dart
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Name App',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: const Text('Name Page'),
),
body: const SafeArea(
child: MyHomePage(),
),
),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
//работает, потому что https
//final String _path = 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl-2.jpg';
//не работает, потому что http
final String _path = 'http://fr38060s.bget.ru/_html/perform/img/car.jpg';
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
@override
Widget build(BuildContext context) {
return Align(
alignment: Alignment.center,
child: Image.network(
_path,
fit: BoxFit.contain,
width: 300.0,
height: 400.0,
),
);
}
}

据我了解,现在您需要列出可以通过HTTP访问的域:
网络安全配置.xml
Android 在发送请求之前检查配置并立即或在连接到服务器时给出错误。
您的请求(从屏幕上的铭文判断)成功。但是服务器返回了代码
403。也就是说,问题出在服务器端——他不喜欢这个请求,他拒绝访问文件。
一些测试表明问题出在
User-Agent- 服务器不喜欢来自 android 的默认服务器,用浏览器中的字符串替换它可以纠正这种情况,但我不知道如何在你的情况下替换它 - 我不知道不知道颤振(但肯定有机会设置请求标头)。也许最好在服务器端解决这个问题,否则从手机查看时网站可能会出现问题。