Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 传递小部件类和简单地传递返回小部件的函数之间有什么区别?_Flutter_Dart - Fatal编程技术网

Flutter 传递小部件类和简单地传递返回小部件的函数之间有什么区别?

Flutter 传递小部件类和简单地传递返回小部件的函数之间有什么区别?,flutter,dart,Flutter,Dart,人们经常会传递一个widget类或调用一个函数,将widget返回到widget的Body属性 让我困惑的是,两者实际上都是有效的。但我不明白什么时候该选择实施哪一项的背后的原因 比如说, class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false,

人们经常会传递一个widget类或调用一个函数,将widget返回到widget的Body属性

让我困惑的是,两者实际上都是有效的。但我不明白什么时候该选择实施哪一项的背后的原因

比如说,

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        **body: _buildContents(context),**
      ),
    );
  }
}
vs


这两者之间的主要区别在于,可以将
const
与小部件构造函数一起使用,但不能将
const
添加到函数调用中。例如:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: _buildContents(context), // you cannot add const here
      ),
    );
  }
}
vs

这对性能很重要。重建小部件树时,具有常量构造函数的小部件不会重建-它们是常量,对吗?但是,对于函数调用,您无法确保每次重建时都执行-function body

你可以想象,当这个特定的小部件构建起来非常昂贵,并且你正在运行你的应用程序时,这是一个巨大的问题,比如说,60 fps——你的“昂贵”功能每秒会被调用60次,在某些情况下,这可能会导致UI呈现出现问题


经验法则:尽可能使用带有常量构造函数的小部件。

这两者之间的主要区别在于,可以将
const
用于小部件构造函数,但不能将
const
添加到函数调用中。例如:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: _buildContents(context), // you cannot add const here
      ),
    );
  }
}
vs

这对性能很重要。重建小部件树时,具有常量构造函数的小部件不会重建-它们是常量,对吗?但是,对于函数调用,您无法确保每次重建时都执行-function body

你可以想象,当这个特定的小部件构建起来非常昂贵,并且你正在运行你的应用程序时,这是一个巨大的问题,比如说,60 fps——你的“昂贵”功能每秒会被调用60次,在某些情况下,这可能会导致UI呈现出现问题

经验法则:尽可能使用带有常量构造函数的小部件

小部件类

它不是一个小部件类,而是一个小部件构造函数

调用函数

这里插入的不是函数调用,而是函数调用的结果

使用构建函数而不是小部件构造函数有很多原因。其中一些:

  • 使代码可读和干净。如果你有一个巨大的小部件树,很难找到一些小部件,你需要花一些时间来找到你正在寻找的小部件的确切位置。很容易理解它是什么小部件,因为现在它有了一个名称。等等此外,当一个小部件树很复杂时,很难阅读和处理它
  • 有时小部件可以在小部件树中使用多次(有时略有不同),因此我们不必复制所有代码,只需参考预先设置的小部件抛出小部件构建函数即可。让我们想象一下,在这种情况下,我们需要更改“孪生”小部件中的某些内容。如果我们有一个构建小部件的功能,我们只能在一个地方完成它,否则我们将查看代码并在几个地方进行更改
  • 有时,使用什么小部件取决于某些逻辑。最好在函数中的某个地方隔离此逻辑,而不是将此逻辑放在小部件树中,否则会使代码和小部件树复杂化,从而给处理带来困难
小部件类

它不是一个小部件类,而是一个小部件构造函数

调用函数

这里插入的不是函数调用,而是函数调用的结果

使用构建函数而不是小部件构造函数有很多原因。其中一些:

  • 使代码可读和干净。如果你有一个巨大的小部件树,很难找到一些小部件,你需要花一些时间来找到你正在寻找的小部件的确切位置。很容易理解它是什么小部件,因为现在它有了一个名称。等等此外,当一个小部件树很复杂时,很难阅读和处理它
  • 有时小部件可以在小部件树中使用多次(有时略有不同),因此我们不必复制所有代码,只需参考预先设置的小部件抛出小部件构建函数即可。让我们想象一下,在这种情况下,我们需要更改“孪生”小部件中的某些内容。如果我们有一个构建小部件的功能,我们只能在一个地方完成它,否则我们将查看代码并在几个地方进行更改
  • 有时,使用什么小部件取决于某些逻辑。最好在函数中的某个地方隔离此逻辑,而不是将此逻辑放在小部件树中,否则会使代码和小部件树复杂化,从而给处理带来困难

这些方法之间没有区别。两者都是一样的。第一个是直接使用类,第二个是将小部件拆分为方法。这是最好的做法。使用Spliting方法,您的代码看起来干净易读。第一种情况不传递函数。它调用函数并传递其返回值。让我怀疑的是,当我传递一个小部件类而不是一个方法时,我还需要提供该类的构建方法。这会对渲染过程产生影响吗?就像我只在某个时候更新homePage(),它只会呈现主页部分?在提供_buildContents(context)的同时,当上层widget在@HemalIf进行更改时,它将呈现所有内容。如果您希望避免重新呈现任何widget,那么您必须创建一个单独的perticualr widget类,并使用无状态widget扩展它,而不是将widget拆分为方法。无状态小部件将避免重复重建所有小部件。请参考这篇文章,你会明白我要说的是什么@Hemal感谢这篇文章,我已经看完了,它对于解释后面的重建工作非常有用。为了避免不必要的重建,它还提到
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: const HomePage(), // If available, you can add const here
      ),
    );
  }
}