Как добавить условный импорт через Flutter для мобильных устройств, веб-сайтов и окон?
У меня есть приложение Flutter, которое использует разные плагины для веб-просмотра для каждой платформы (мобильный, веб, оконный).
Хотя я могу
import
платформа на базе
web
и я не могу импортировать для Windows.
Я попытался добавить условие else, если оно не мобильное или веб-приложение, но оно требует
mobile
плагин.
- Вот как я импортирую пакет для Интернета и мобильных устройств (рабочий).
import 'package:eam_flutter/form/mobileui.dart'
if (dart.library.html) 'package:eam_flutter/form/webui.dart'
as multiPlatform;
- Вот как я импортирую пакет для Интернета, мобильных устройств и Windows (не работает, он показывает исключение мобильного веб-просмотра, поскольку он не поддерживает рабочий стол).
import 'package:eam_flutter/form/windowui.dart'
if (dart.library.html) 'package:eam_flutter/form/webui.dart'
if (dart.library.io) 'package:eam_flutter/form/mobileui.dart'
as multiPlatform;
Как я могу указать условный импорт для окон?
5 ответов
Поскольку для окна нет поддержки условного импорта, поскольку оно входит в состав dart io. У меня есть обходной путь, и он работает.
В итоге я создаю файл для каждой платформы с разным импортом пакетов.
import 'package:flutter/foundation.dart' show kIsWeb;
import 'dart:io' as io;
if(kIsWeb){
{
return WebPage(); //your web page with web package import in it
}
else if (!kIsWeb && io.Platform.isWindows) {
return WindowsPage(); //your window page with window package import in it
}
else if(!kIsWeb && io.Platform.isAndroid) {
return AndroidPage(); //your android page with android package import in it
}
//you can add others condition...
Для всех, кто обнаружит это, обратите внимание, что принятый ответ не является ответом на заданный вопрос. Ответ на заданный вопрос: нельзя. Невозможно использовать условный импорт для получения различного поведения между мобильным устройством и настольным компьютером; см. этот комментарий от команды Dart.
Проверьте этот пример, вам нужно создать 2 файла, один для Интернета, а другой для ОС, и использовать условие при импорте.
Может быть, нам больше не нужен условный импорт. Посмотрите на код ниже:
import 'package:package1/package1.dart';
import 'package:package2/package2.dart';
const keepFunc1 = bool.fromEnvironment('KEEP_FUNC1');
dynamic result2;
void main() {
if (keepFunc1) {
result2 = Calculator1()..addOne(1);
} else {
result2 = Calculator2()..addOne(1);
}
runApp(const MyApp());
}
ЕслиKEEP_FUNC1
переменная среды не указана дляtrue
. package1
и классCaculator1
не будет упакован в apk или ipa .
Подробнее см. ответ, который я написал здесь.
Таким образом, мы можем импортировать все пакеты и использовать константное значение среды, чтобы решить, какие пакеты импортировать. Механизм встряхивания дерева достаточно умен, чтобы удалить неиспользуемые части.