Evite el uso de bibliotecas solo web fuera de los paquetes de complementos web de Flutter

4 minutos de lectura

Avatar de usuario de Suragch
Suragch

Estoy creando una aplicación Flutter que estoy tratando de hacer que funcione en la web. Parte de él contiene un código específico de la web:

import 'dart:html' as html;
import 'package:flutter/foundation.dart';

class DownloadViewModel extends ChangeNotifier {
  static const String url="https://example.com/api/v1/app/myapp_1.0.0.apk";
  void onAndroidDownloadPressed() {
    html.window.open(url, 'AndroidApp');
  }
}

Sin embargo, el dart:html import da el siguiente error:

Evite el uso de bibliotecas solo web fuera de los paquetes de complementos web de Flutter

La versión más larga de la advertencia se ve así:

Evite el uso de bibliotecas web, dart:html, dart:js y dart:js_util en paquetes de Flutter que no son complementos web. Estas bibliotecas no se admiten fuera de un contexto web; la funcionalidad que depende de ellos fallará en el tiempo de ejecución en Flutter mobile y, por lo general, se desaconseja su uso en Flutter web.

Se permite el acceso a la biblioteca web en:

plugin packages that declare web as a supported context

de lo contrario, las importaciones de dart:html, dart:js y dart:js_util no están permitidos.

Y no es solo una advertencia. En realidad, esto impide crear una aplicación para Android o iOS (aunque no se puede acceder a este método desde aplicaciones que no son de Web Flutter).

La única solución que he descubierto es comentar la importación cuando estoy compilando para Android e iOS y luego descomentarla cuando estoy compilando para la web. ¿Hay una solución mejor?

Avatar de usuario de Suragch
Suragch

Utilizar el universal_html paquete. Es compatible con el navegador, Dart VM y Flutter y es un reemplazo sustituto para dart:html y otras bibliotecas relacionadas con la web.

dependencies:
  universal_html: ^1.2.1

Entonces en vez de usar import 'dart:html' as html; puede usar la siguiente importación:

import 'package:universal_html/html.dart' as html;

Para aquellos que llegaron a esta página por otros problemas relacionados con la importación web (como dart:js), este complemento también admite las siguientes importaciones:

import 'package:universal_html/driver.dart';
import 'package:universal_html/html.dart';
import 'package:universal_html/indexed_db.dart';
import 'package:universal_html/js.dart';
import 'package:universal_html/js_util.dart';
import 'package:universal_html/prefer_sdk/html.dart';
import 'package:universal_html/prefer_sdk/indexed_db.dart';
import 'package:universal_html/prefer_sdk/js.dart';
import 'package:universal_html/prefer_sdk/js_util.dart';
import 'package:universal_html/prefer_sdk/svg.dart';
import 'package:universal_html/prefer_sdk/web_gl.dart';
import 'package:universal_html/prefer_universal/html.dart';
import 'package:universal_html/prefer_universal/indexed_db.dart';
import 'package:universal_html/prefer_universal/js.dart';
import 'package:universal_html/prefer_universal/js_util.dart';
import 'package:universal_html/prefer_universal/svg.dart';
import 'package:universal_html/prefer_universal/web_gl.dart';
import 'package:universal_html/svg.dart';
import 'package:universal_html/web_gl.dart';

  • universal_html: ^1.2.2 no me serviria pero universal_html: ^1.2.1 como se muestra en la documentación vinculada hizo.

    – Subdesbordamiento de pila

    3 de junio de 2020 a las 19:43

  • @StackUnderflow. Bien, gracias por la notificación. Tal vez sea un error en su número de versión. De todos modos, actualicé temporalmente mi respuesta para usar 1.2.1.

    – Suragch

    3 de junio de 2020 a las 23:35

  • Estaba usando FunctionStringCallback y estaba causando este error. Intente cambiarlo a una variable final.

    – Bensal

    28 de agosto de 2020 a las 16:08

  • universal_html no está identificado, ¿hay alguna alternativa?

    – Shan Mark

    27 de mayo de 2022 a las 5:37


Avatar de usuario de Sharon Atim
Sharon Atim

Desde la fusión de Flutter-web en el repositorio principal de Flutter, ya no es posible agregar directamente importaciones para bibliotecas web (p. ej., dart:html o dart:js) en un proyecto de Flutter en el canal principal cuando se dirige a Web, Android e iOS. .

Utilice el paquete html universal que proporciona un amplio soporte para múltiples plataformas y bibliotecas web.

  1. Desde el nivel raíz de su proyecto, comando

    flutter pub add universal_html
    
  2.   import 'package:universal_html/html.dart' as html
    

Este paquete no es necesario para ejecutar algunos archivos web (p. ej., dart:js). En mi caso, solo tuve que eliminar la declaración de importación ‘dart: js’ de importación.

¿Ha sido útil esta solución?