如何避免在dart / flutter中为每个文件编写导入文件?

时间:2019-04-08 17:52:34

标签: dart flutter

我正在制作一个Flutter应用程序,并且为我使用的每个自定义小部件创建了一个文件/类。然后,我将所有这些文件导入主屏幕,但是我不喜欢它的外观。特别是因为如果我想添加另一个小部件或删除一个小部件,则需要弄乱导入内容。

是否存在类似C#命名空间的东西,我可以对文件夹/命名空间中的所有文件进行一次导入?

我已经尝试成功使用库/零件,但是在https://www.dartlang.org/guides/libraries/create-library-packages中说应该避免使用零件/零件。那么,我们应该导入每个文件吗?

代替:

import 'package:custom_widgets/custom_multiplechoice.dart';
import 'package:custom_widgets/custom_singlechoice.dart';
import 'package:custom_widgets/custom_time.dart';
import 'package:custom_widgets/custom_yesnochoice.dart';
import 'package:custom_widgets/custom_date.dart';

我想要:

import 'package:custom_widgets';

2 个答案:

答案 0 :(得分:3)

是的,您可以使用export来实现所需的功能。

您可以将所有小部件放置在一个文件夹中,例如libs/src/,然后在custom_widgets.dart中创建文件libs/,并在export中使用custom_widgets.dart这样:

export 'src/custom_multiplechoice.dart';
export 'src/custom_singlechoice.dart';
export 'src/custom_time.dart';
export 'src/custom_widgets/src/custom_yesnochoice.dart';
export 'src/custom_date.dart';

一旦您import custom_widgets.dart,所有这些小部件都将对您可用。

检查一下,所有解释在这里:Dart: Organizing a library package

更新:

在Dart中,没有namespaces像大多数其他语言一样。 Dart使用libraries进行封装,隐藏数据。 将类导入代码的唯一方法是在文件的开头使用import,该文件也应该是一个库。

我对此也有疑问。想象一下您想动态导入库的情况。假设您要在应用程序中实现MVC pattern,如果要在服务器上执行此操作,则将有一个Router class可以分析URL并确定要实例化的Controller class和实例Method从该控制器进行调用。现在,每个URL都会触发不同的Controller,而您事先并不知道它,这取决于您的路由器来检测要实例化的类。在这种情况下,您需要执行的操作是导入每个可能在文件开头实例化的Controller。我对此有疑问。如果您的应用程序变大并且必须导入,比如说20个Controller类,那么Router / Dispatcher可以调用其中之一,而实际上,您将仅调用一个Controller,因为每个URL仅包含Controller。

如果要使用库,则手动加载不会有问题,但是对于如上所述的情况,Dart会失败,因为没有“自动加载”类,例如在PHP中,您可以使用使用命名空间的自动加载程序来查找类的位置,并在代码中间动态实例化一个类。

答案 1 :(得分:0)

此VSCode扩展可以帮助创建此扩展。

Dart Barrel File Generator