【问题标题】:What is the difference between Flutter packages widgets.dart, material.dart and cupertino.dart and which one to use?Flutter 包 widgets.dart、material.dart 和 cupertino.dart 有什么区别,使用哪一个?
【发布时间】:2019-11-09 21:01:35
【问题描述】:

在使用 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 平台特定的变体?

【问题讨论】:

    标签: flutter


    【解决方案1】:

    发生的情况是,类是在框架的下部定义的(这里foundationFlutterError

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

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

    例如material.dart 大致如下:

    export 'package:flutter/widget.dart';
    
    class RaisedButton { }
    

    【讨论】:

    • 谢谢,但是要导入的正确包是什么(通常 / 在 iOS / Android 上,用于原生元素的平台敏感 UI)?
    • Remi 的回答暗示您可以使用任何您喜欢的导入,因为相同的确切类在材料或 cupertino 中重新导出。
    【解决方案2】:

    您可以从任何库中导入泛型类。这个例子:

    import 'package:flutter/material.dart';
    //import 'package:flutter/widgets.dart';
    
    class Foo extends InheritedWidget {
    }
    

    无论您从哪个库导入它,都将使用相同的 InheritedWidget 实现。尝试注释掉每个导入,然后在 AndroidStudio 中通过 Ctrl+单击 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 作为起点。

    【讨论】:

      【解决方案3】:

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

      'package:flutter/foundation.dart' 如果您要使用实用程序类和函数来创建 UI 层,则必须使用。

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

      【讨论】:

        猜你喜欢
        • 2021-12-08
        • 2023-01-26
        • 2011-09-16
        • 1970-01-01
        • 2012-01-16
        • 2020-02-22
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        相关资源
        最近更新 更多