9

当我在颤振网络上使用 dart:io 库时,调试时会出现警告.like

[警告]build_web_compilers:web/main.dart 上的入口点:跳过使用 ddc 编译 retgoo_internal|web/main.dart,因为它的一些传递库具有此平台不支持的 sdk 依赖项:

retgoo_internal|lib/protocol/http_aiframework.dart

但是当我使用时import 'package: flutter_web / io.dart';有一个错误代码,.transform 这里的代码是 http_aiframework.dart 代码

import 'dart:async';
import 'dart:convert';
import 'dart:io';
//import 'package:flutter_web/io.dart';

import '../main.dart';

typedef HttpProgressListener(int totalBytes, int receivedBytes, bool done);

class Http {
  static String baseURL;

  static bool loadAccessToken() {
    return accessToken != null;
  }

  static bool setAccessToken(String token) {
    accessToken = token;
    return accessToken != null;
  }

  static bool removeAccessToken() {
    accessToken = null;
    return accessToken == null;
  }

  static _processHeader(
      {HttpClientRequest request, Map<String, dynamic> headers}) {
    if (headers != null) {
      headers.forEach((key, value) {
        request.headers.add(key, value);
      });
    }

    if (accessToken != null) {
      request.headers.set("Authorization", "Bearer " + accessToken);
    }
  }

  static _processResponse(
      {HttpClientResponse response,
      HttpProgressListener progressListener}) async {
    final int totalBytes = response.contentLength;
    int receivedBytes = 0;

    String body = await response
        .transform( //this is the error code when I use import 'package: flutter_web / io.dart';
          StreamTransformer.fromHandlers(
            handleData: (data, sink) {
              sink.add(data);

              if (progressListener != null) {
                receivedBytes += data.length;
                progressListener(totalBytes, receivedBytes, false);
              }
            },
            handleDone: (sink) {
              sink.close();
              if (progressListener != null) {
                progressListener(totalBytes, receivedBytes, true);
              }
            },
          ),
        )
        .map((v) => utf8.decoder.convert(v))
        .join();

    return body;
  }

  static getData({
    String baseURL,
    String endpoint,
    Map<String, dynamic> headers,
    HttpProgressListener downloadProgressListener,
    dynamic data,
  }) async {
    final client = HttpClient();
    client.userAgent = "AIFramework/";
    client.connectionTimeout = Duration(seconds: 30);

    HttpClientRequest request;
    String mBaseURL = baseURL ?? Http.baseURL;

    var uri = Uri.parse("$mBaseURL$endpoint");

    if (data == null) {
      request = await client.getUrl(uri);
    } else {
      request = await client.postUrl(uri);
    }

    _processHeader(
      request: request,
      headers: headers,
    );

    if (data != null) {
      String payload = json.encode(data);
      request.write(payload);
    }

    final response = await request.close();
    if (response.statusCode == 200) {
      return json.decode(
        await _processResponse(
          response: response,
          progressListener: downloadProgressListener,
        ),
      );
    }

    return null;
  }
}
4

4 回答 4

12

您可以使用universal_io包。除了 Android 和 iOS,它还支持网络。

dependencies:
  universal_io: ^1.0.1

执行以下导入而不是dart:io

import 'package:universal_io/io.dart';

它的工作方式相同。

相关问题:避免在 Flutter Web 插件包之外使用纯 Web 库

于 2020-03-12T03:22:47.143 回答
6

我自己也遇到了这个问题,看起来 dart:io 库不适用于 Web 应用程序。

来自:https ://api.flutter.dev/flutter/dart-io/dart-io-library.html

重要提示:基于浏览器的应用程序不能使用此库。只有服务器、命令行脚本和 Flutter 移动应用程序可以导入和使用 dart:io。

于 2019-08-22T01:40:57.537 回答
0

如果你想从 io.dart 使用 WebSocket,你可以使用 html 包中的 HtmlWebSocketChannel (import 'package:web_socket_channel/html.dart';)

于 2019-09-27T13:16:24.710 回答
0

StreamTransformer 有两种泛型,具体如下

StreamTransformer<List<int>, String>

ps:Dart 是一种类型安全和动态类型的语言。

于 2019-07-09T09:38:54.053 回答