如何在 flutter web 中支持 HTTP headers NetworkImage
How to support HTTP headers NetworkImage in flutter web
我试图在flutter web中从网上获取一些需要添加headers的图片。
我用过 cached_network_image: ^2.5.1 并且它不完全支持网络 Image.network 似乎 运行 在网络上飘动时 headers 没有被使用。这两种方式在 Android 版本上都成功运行。
environment:
sdk: ">=2.7.0 <3.0.0"
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.0.4, on Microsoft Windows [Version 10.0.19042.985], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[√] Chrome - develop for the web
[√] Android Studio (version 4.1.0)
[√] IntelliJ IDEA Ultimate Edition (version 2020.1)
[√] Connected device (3 available)
• No issues found!
最有可能的是,此特定限制是由于 img
HTML 元素本身的自定义功能降低所致。幸运的是,还有许多其他方式可以显示网络图像——这里仅举两个例子:
使用 http 包:
void loadImageV1(String url, Map<String, String>? headers) async {
final res = await http.get(Uri.parse(url), headers: headers);
final blob = html.Blob([res.bodyBytes]);
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
或使用浏览器公开 fetch API:
void loadImageV2(String url, Map<String, String>? headers) async {
final res = await html.window.fetch(url, {'method': 'GET', 'headers': headers});
final blob = await res.blob();
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
现在我们可以将生成的合成词 url 与 Image.Network 构造函数一起使用。
这是完整的演示:
import 'dart:html' as html;
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Network Image Demo',
home: NextLabPage(),
);
}
}
const imgUrl = 'https://robohash.org/1234';
const imgHeaders = {'Accept': 'image/*', 'Accept-language': 'en'};
class NextLabPage extends StatefulWidget {
@override
_NextLabPageState createState() => _NextLabPageState();
}
class _NextLabPageState extends State<NextLabPage> {
String? _url;
@override
void initState() {
super.initState();
loadImageV1(imgUrl, imgHeaders);
}
@override
void dispose() {
if (_url != null) html.Url.revokeObjectUrl(_url!);
super.dispose();
}
void loadImageV1(String url, Map<String, String>? headers) async {
final res = await http.get(Uri.parse(url), headers: headers);
final blob = html.Blob([res.bodyBytes]);
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
void loadImageV2(String url, Map<String, String>? headers) async {
final res = await html.window.fetch(url, {'method': 'GET', 'headers': headers});
final blob = await res.blob();
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: _url != null ? Image.network(_url!) : Text('Loading...'),
),
);
}
}
With cached_network_image: 3.0.0 我通过使用 CachedNetworkImageProvider class.[=12= 来添加 headers ]
CachedNetworkImageProvider(
"${IOConfig.apiUrl}",
headers: {"Authorization": "Bearer $apiToken",
"Access-Control-Allow-Headers": "Access-Control-Allow-Origin, Accept"}
,imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet)
我不得不从一个参数开始它来改变 web-renderer
flutter run -d chrome --web-renderer html
我试图在flutter web中从网上获取一些需要添加headers的图片。
我用过 cached_network_image: ^2.5.1 并且它不完全支持网络 Image.network 似乎 运行 在网络上飘动时 headers 没有被使用。这两种方式在 Android 版本上都成功运行。
environment:
sdk: ">=2.7.0 <3.0.0"
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.0.4, on Microsoft Windows [Version 10.0.19042.985], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[√] Chrome - develop for the web
[√] Android Studio (version 4.1.0)
[√] IntelliJ IDEA Ultimate Edition (version 2020.1)
[√] Connected device (3 available)
• No issues found!
最有可能的是,此特定限制是由于 img
HTML 元素本身的自定义功能降低所致。幸运的是,还有许多其他方式可以显示网络图像——这里仅举两个例子:
使用 http 包:
void loadImageV1(String url, Map<String, String>? headers) async {
final res = await http.get(Uri.parse(url), headers: headers);
final blob = html.Blob([res.bodyBytes]);
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
或使用浏览器公开 fetch API:
void loadImageV2(String url, Map<String, String>? headers) async {
final res = await html.window.fetch(url, {'method': 'GET', 'headers': headers});
final blob = await res.blob();
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
现在我们可以将生成的合成词 url 与 Image.Network 构造函数一起使用。
这是完整的演示:
import 'dart:html' as html;
import 'package:http/http.dart' as http;
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Network Image Demo',
home: NextLabPage(),
);
}
}
const imgUrl = 'https://robohash.org/1234';
const imgHeaders = {'Accept': 'image/*', 'Accept-language': 'en'};
class NextLabPage extends StatefulWidget {
@override
_NextLabPageState createState() => _NextLabPageState();
}
class _NextLabPageState extends State<NextLabPage> {
String? _url;
@override
void initState() {
super.initState();
loadImageV1(imgUrl, imgHeaders);
}
@override
void dispose() {
if (_url != null) html.Url.revokeObjectUrl(_url!);
super.dispose();
}
void loadImageV1(String url, Map<String, String>? headers) async {
final res = await http.get(Uri.parse(url), headers: headers);
final blob = html.Blob([res.bodyBytes]);
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
void loadImageV2(String url, Map<String, String>? headers) async {
final res = await html.window.fetch(url, {'method': 'GET', 'headers': headers});
final blob = await res.blob();
setState(() {
_url = html.Url.createObjectUrlFromBlob(blob);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Center(
child: _url != null ? Image.network(_url!) : Text('Loading...'),
),
);
}
}
With cached_network_image: 3.0.0 我通过使用 CachedNetworkImageProvider class.[=12= 来添加 headers ]
CachedNetworkImageProvider(
"${IOConfig.apiUrl}",
headers: {"Authorization": "Bearer $apiToken",
"Access-Control-Allow-Headers": "Access-Control-Allow-Origin, Accept"}
,imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet)
我不得不从一个参数开始它来改变 web-renderer
flutter run -d chrome --web-renderer html