【问题标题】:How to support HTTP headers NetworkImage in flutter web如何在 Flutter Web 中支持 HTTP 标头 NetworkImage
【发布时间】:2021-08-13 18:47:30
【问题描述】:

我试图在 Flutter Web 中从互联网上获取一些需要添加标题的图像。 我使用了 cached_network_image: ^2.5.1 并且它不完全支持 web 并且 Image.network 在 web 上运行颤振时似乎也没有使用标题。这两种方式都成功地适用于 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!

【问题讨论】:

    标签: flutter http-headers flutter-web


    【解决方案1】:

    使用 cached_network_image: 3.0.0 我可以使用 CachedNetworkImageProvider 类添加标头。

    CachedNetworkImageProvider(
                  "${IOConfig.apiUrl}",
                  headers: {"Authorization": "Bearer $apiToken",
                    "Access-Control-Allow-Headers": "Access-Control-Allow-Origin, Accept"}                                                
                 ,imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet)
    

    我必须以更改网络渲染器的参数开始它

    flutter run -d chrome --web-renderer html 
    

    【讨论】:

      【解决方案2】:

      这个特殊的限制很可能是由于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...'),
            ),
          );
        }
      }
      
      

      【讨论】:

        猜你喜欢
        • 2019-10-29
        • 2020-02-16
        • 1970-01-01
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 2012-02-09
        • 2021-03-23
        相关资源
        最近更新 更多