本文主要介绍

Flutter 使用了一种全新的方法,您可以使用 widgets代替 Views 。Android 中的 View 主要是布局的一个元素,但在 Flutter 中,Widget 几乎就是一切。从按钮到布局结构的一切都是小部件。这里的优势在于可定制性。想象一下 Android 中的一个按钮。它具有文本等属性,可让您向按钮添加文本。但是 Flutter 中的按钮不是将标题作为字符串,而是另一个小部件。这意味着**在按钮内你可以有文本、图像、图标和几乎任何你可以想象的东西,**而不会打破布局限制。这也让您可以非常轻松地制作自定义小部件,而在 Android 中制作自定义视图是一件相当困难的事情。

拖拽不是比在代码中制作布局更容易吗?

在某些方面,确实如此。但是 Flutter 社区中的很多人更喜欢代码方式,但这并不意味着无法实现拖拽。如果你完全喜欢拖拽,那么 Flutter Studio 是我推荐的一个很棒的资源,它可以帮助你通过拖放生成布局。这是一个让我印象深刻的工具,很想看看它是如何发展的。

链接:https : //flutterstudio.app

Flutter 是否像浏览器一样工作?/ 它与基于 WebView 的应用程序有何不同?

简单地回答这个问题:您为 WebView 或类似运行的应用程序编写的代码必须经过多个层才能最终执行。从本质上讲,Flutter 通过编译为原生 ARM代码以在两个平台上执行,从而实现了跨越。“混合”应用程序缓慢、缓慢,并且看起来与它们运行的平台不同。Flutter 应用程序的运行速度比它们的混合应用程序快得多。此外,使用插件访问原生组件和传感器比使用无法充分利用其平台的 WebView 更容易。

为什么 Flutter 项目中有 Android 和 iOS 文件夹?

Flutter 项目中主要有 3 个文件夹:lib、android 和 ios。‘lib’ 负责处理您的 Dart 文件。Android 和 iOS 文件夹的存在是为了在各自的平台上实际构建应用程序,并在其上运行 Dart 文件。它们还帮助您向项目添加权限和特定于平台的功能。当您运行 Flutter 项目时,它会根据运行的模拟器或设备进行构建,使用其中的文件夹进行 Gradle 或 XCode 构建。简而言之,这些文件夹是整个应用程序,它们为 Flutter 代码的运行奠定了基础。

为什么我的 Flutter 应用这么大?

如果您运行过 Flutter 应用程序,您就会知道它的速度很快。速度极快。它是如何做到的?在构建应用程序时,它不是只使用特定资源,而是实质上需要所有资源。为什么这有帮助?因为如果我将一个图标从一个更改为另一个,则不必完全重建应用程序。这就是 Flutter调试构建如此庞大的原因。创建发布版本时,只会获取所需的资源,并获得我们更习惯的大小。Flutter 应用程序仍然会比 Android 应用程序大一点,但它相当小,而且 Flutter 团队一直在寻找减少应用程序大小的方法。

如果我是编程新手,想从移动端开发入手,应该从 Flutter 开始吗?

这有更多的两部分答案。

  1. Flutter 非常适合编写代码,并且在相同页面上的代码比 Android 或 iOS 应用程序少得多。所以对于大多数应用,我认为不会有大问题。
  2. 您需要记住的一件事是 Flutter 还依赖于 Android 和 iOS 项目,您至少需要熟悉其中的项目结构。如果您想编写任何本机代码,您肯定需要在任一平台或两个平台上的经验。

我个人的意见是先学习一两个月的 Android/iOS,然后从 Flutter 开始。

什么是package和插件?

package允许您将新的小部件或功能导入您的应用程序。package和插件之间有一个小的区别。包通常是纯粹用 Dart 编写的新组件或代码,而插件则可以使用本机代码在设备端提供更多功能。通常在 DartPub 上,包和插件都被称为包,只有在创建新包时才会明确提到区别。

什么是 pubspec.yaml 文件,它有什么作用?

Pubspec.yaml 允许您定义您的应用程序依赖的包,声明您的资产,如图像、音频、视频等。它还允许您为您的应用程序设置约束。对于 Android 开发者来说,这大致类似于 build.gradle 文件,但两者之间的差异也很明显。

为什么第一个 Flutter 应用构建需要这么长时间?

首次构建 Flutter 应用程序时,会构建特定设备的 APK 或 IPA 文件。因此,使用 Gradle 和 XCode 构建文件需要时间。下次重新启动或热加载应用程序时,Flutter 基本上会在现有应用程序之上修补更改,从而提供极快的刷新。

注意:通过热重载或重启所做的更改不会保存在设备 APK 或 IPA 文件中。为确保您的应用在设备上进行所有更改,请考虑再次停止并运行该应用。

state是什么意思?什么是 setState()?

**简单来说,“状态”是小部件变量值的集合。**任何可以改变的东西,比如计数器计数、文本等,都可以成为 State 的一部分。想象一个计数器应用程序,主要的动态是计数器计数。当计数改变时,需要刷新屏幕以显示新值。setState() 本质上是一种告诉应用程序使用新值刷新和重建屏幕的方法。

什么是有状态和无状态小部件?

TL;DR:允许您刷新屏幕的小部件是有状态小部件。没有状态的小部件是无状态的。

更详细地说,一个内容可以改变的动态小部件应该是一个有状态的小部件。无状态小部件只能在更改参数时更改内容,因此需要在小部件层次结构中的位置点上方完成。包含静态内容的屏幕或小部件应该是无状态小部件,但要更改内容,需要有状态。

你如何处理 Flutter 代码中的缩进和结构?

Android Studio 提供了工具来简化 Flutter 代码的结构化。主要的两点是:

  1. Alt + Enter/ Command + Enter:这使您可以轻松地包装和删除小部件以及在复杂的层次结构中交换小部件。要使用它,只需将光标指向小部件声明并按下按键即可提供一些选项。这有时感觉像是天赐之物。
  2. DartFMT:dartfmt 格式化您的代码以保持干净的层次结构和缩进。在您不小心移动了几个括号后,它会使您的代码更漂亮。

为什么我们将函数传递给小部件?

我们将一个函数传递给一个小部件,本质上是说,“当有事情发生时调用这个函数”。函数是 Dart 中的第一类对象,可以作为参数传递给其他函数。使用 Android (<Java 8) 等接口的回调对于简单的回调有太多的样板代码。

Java回调:

button.setOnClickListener(new View.OnClickListener() {
    @override
    public void onClick(View view) {
      // Do something here
    }
  }
);

(注意,这只是设置监听器的代码。定义按钮需要单独的 XML 代码。)

Dart equivalent:

FlatButton(
  onPressed: () {
    // Do something here
  }
)

(Dart 既做声明又设置回调。)

这变得更加清晰和有条理,并帮助我们避免不必要的复杂化