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
ydart: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
ydart: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?
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 perouniversal_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
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.
-
Desde el nivel raíz de su proyecto, comando
flutter pub add universal_html
-
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.