Как добавить условный импорт через Flutter для мобильных устройств, веб-сайтов и окон?

У меня есть приложение Flutter, которое использует разные плагины для веб-просмотра для каждой платформы (мобильный, веб, оконный).
Хотя я могу import платформа на базе web и я не могу импортировать для Windows.

Я попытался добавить условие else, если оно не мобильное или веб-приложение, но оно требует mobile плагин.

  1. Вот как я импортирую пакет для Интернета и мобильных устройств (рабочий).
      import 'package:eam_flutter/form/mobileui.dart'
    if (dart.library.html) 'package:eam_flutter/form/webui.dart'
    as multiPlatform;   
  1. Вот как я импортирую пакет для Интернета, мобильных устройств и 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 файла, один для Интернета, а другой для ОС, и использовать условие при импорте.

Вместо этого используйте этот пакет.

      universal_html

Может быть, нам больше не нужен условный импорт. Посмотрите на код ниже:

      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 .

Подробнее см. ответ, который я написал здесь.

Таким образом, мы можем импортировать все пакеты и использовать константное значение среды, чтобы решить, какие пакеты импортировать. Механизм встряхивания дерева достаточно умен, чтобы удалить неиспользуемые части.

Другие вопросы по тегам