Flutter软件包widgets.dart,material.dart和cupertino.dart有什么区别,以及使用哪一个?

时间:2019-06-27 19:59:31

标签: flutter

在使用flutter时,我经常遇到一种由标准库中的不同包公开的类型。

例如FlutterError,但其他小部件也是如此。在编写它并在VS Code中使用IntelliSense来解析要导入的包,以便FlutterError可用时,IntelliSense在多个不同的包中为我提供FlutterError:

在这种情况下,可以从

获得
  • package:flutter/widgets.dart
  • package:flutter/foundation.dart
  • package:flutter/material.dart
  • package:flutter/cupertino.dart
  • package:flutter/rendering.dart

我的理解是material.dartcupertino.dart提供了特定样式的小部件-但是剩下的是什么,我应该在MaterialApp(..)中导入哪个软件包,这些软件包应该与平台无关,并且在iOS上运行?

而且-如果有区别-应该使用哪个,以便在Android和iOS上自动使用平台特定的小部件来实现本机功能,例如日期/时间选择器,以便日期选择器自动在Android和iOS上特定于平台的变体?

3 个答案:

答案 0 :(得分:1)

发生的事情是,该类在框架的下部定义(此处foundation代表FlutterError

然后,框架的高层使用export指令重新导出较低层的内容。

这样做主要是为了确保开发人员在通常需要它们时,不必导入5种以上的不同东西。

例如material.dart看起来像这样:

export 'package:flutter/widget.dart';

class RaisedButton { }

答案 1 :(得分:0)

您可以从任何库导入通用类。这个例子:

import 'package:flutter/material.dart';
//import 'package:flutter/widgets.dart';

class Foo extends InheritedWidget {
}

无论您从哪个库导入它,都将使用相同的InheritedWidget实现。尝试对每个导入进行注释,然后按住Ctrl键并单击AndroidStudio中的InheritedWidget,将打开包含实现的文件。

从我的角度来看,如果要进行材质设计,最好使用单个导入import 'package:flutter/material.dart';,而不是两个(来自material.dartwidgets.dart)。如果您的代码对UI库是中立的,那么很显然可以从系统库中导入。

您不能使用从中立系统库导入的通用类来在编译时自动在Cupertino和Material库之间切换。您应该明确使用特定的UI库小部件。

如果要在库之间切换,则应自行开发此逻辑。您可以阅读本文https://medium.com/flutter/do-flutter-apps-dream-of-platform-aware-widgets-7d7ed7b4624d作为起点。

答案 2 :(得分:0)

'package:flutter / widgets.dart'用于稍后使用dart创建小部件,这些小部件将在main.dart内部使用,并使代码更加清晰。

如果要使用实用程序类和函数来创建UI层,必须使用

“ package:flutter / foundation.dart”。

如果要在应用程序中使用Android框架,将使用'package:flutter / material.dart'。如果要在自己的IO中使用IOs,则'package:flutter / cupertino.dart'将用于选择application。默认情况下,使用材料类型。没关系,您使用的是材料类型UI或cupertino UI。您可以将Android UI用于IO设备,也可以将IO UI用于Android设备。