如何在Flutter移动端、Web端和Windows端添加有条件的导入?

19

我有一个Flutter应用程序,它在每个平台(移动设备、Web和Windows)上使用不同的WebView插件。
尽管我能够基于webmobile进行import,但我无法为Windows导入。

我已经尝试添加else条件,以防不是移动设备或Web,但它会使用mobile插件。

  1. 这是我为Web和移动设备导入包的方式(有效)。

import 'package:eam_flutter/form/mobileui.dart'
    if (dart.library.html) 'package:eam_flutter/form/webui.dart'
    as multiPlatform;   
  1. 这是我在网页、移动设备和Windows中导入包的方法(但由于不支持桌面端,它无法正常工作,显示移动设备的webview异常)。
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;

我该如何为 Windows 指定条件导入?


1
您无法查看: 请参阅 https://dev59.com/J7vpa4cB1Zd3GeqPCP20#67948233 - smorgan
@smorgan 这个有什么解决办法吗? - Kunchok Tashi
@codingwithtashi 解决什么问题?这个问题没有说明需要解决的问题,只是想要一个特定的解决方案,而那个特定的解决方案是不可能的。可能有其他解决潜在问题的方案。 - smorgan
@smorgan 我的意思是,如何使其在没有平台错误的情况下正常工作,但没关系,我已经让它正常工作了。谢谢。 - Kunchok Tashi
我刚才完成了上面的代码,但在这里遇到了断点: completer.complete(files.map((html.File file) - user40823
5个回答

18

对于其他人发现这个问题的人,请注意接受的答案并不是回答所提出的问题。回答所提出的问题是您无法使用条件导入在移动设备和桌面之间获得不同的行为;请参见 Dart团队的这条评论


如果没有条件导入,如何在移动端/网页上使用相同的代码? - Nazarii Kahaniak
@NazariiKahaniak,你提出了一个不同的问题。你可以根据VM vs. web(如问题中所示)进行有条件的导入;但是你不能根据不同的VM平台(例如移动设备与桌面设备)进行有条件的导入。 - jamesdlin

5

由于window属于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...

5
请注意,这是对一个不同问题的回答。原问题是关于在编译时有不同行为;但这会导致在运行时有不同行为。如果您需要后者,则这并不是一种解决方法,而是正常的做法。如果需要前者(如果出于某种原因真的需要),它并没有帮助,因此根本不是解决方法。 - smorgan
@smorgan,谢谢。有了给定的代码,我可以避免出现的问题。我认为我应该采用这种方式,因为在Windows中没有条件导入。 - KonTash
5
这就是为什么通常更好的做法是询问你试图解决的问题,而不是如何实施你认为是解决问题的一种特定解决方案。如果你问如何在不同平台上运行不同的代码,这将是一个好答案。相反,现在有一个SO问题有一个不正确的被接受的答案,将来可能会让其他人感到困惑。 - smorgan

2
请使用那个软件包。
universal_html

1

也许我们不再需要条件导入。 看看下面的代码:

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不会被打包到apkipa中。更多细节请看我在这里写的答案。(链接)因此,我们可以导入所有的包,并使用一个const环境值来决定导入哪些包。摇树机制足够聪明,可以删除未使用的部分。

1
检查这个示例,你需要创建两个文件,一个用于Web,另一个用于操作系统,并在导入时使用条件。

3
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接