Flutter 传递小部件类和简单地传递返回小部件的函数之间有什么区别?
人们经常会传递一个widget类或调用一个函数,将widget返回到widget的Body属性 让我困惑的是,两者实际上都是有效的。但我不明白什么时候该选择实施哪一项的背后的原因 比如说,Flutter 传递小部件类和简单地传递返回小部件的函数之间有什么区别?,flutter,dart,Flutter,Dart,人们经常会传递一个widget类或调用一个函数,将widget返回到widget的Body属性 让我困惑的是,两者实际上都是有效的。但我不明白什么时候该选择实施哪一项的背后的原因 比如说, class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false,
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呈现出现问题
经验法则:尽可能使用带有常量构造函数的小部件
小部件类
它不是一个小部件类,而是一个小部件构造函数
调用函数
这里插入的不是函数调用,而是函数调用的结果
使用构建函数而不是小部件构造函数有很多原因。其中一些:
- 使代码可读和干净。如果你有一个巨大的小部件树,很难找到一些小部件,你需要花一些时间来找到你正在寻找的小部件的确切位置。很容易理解它是什么小部件,因为现在它有了一个名称。等等此外,当一个小部件树很复杂时,很难阅读和处理它李>
- 有时小部件可以在小部件树中使用多次(有时略有不同),因此我们不必复制所有代码,只需参考预先设置的小部件抛出小部件构建函数即可。让我们想象一下,在这种情况下,我们需要更改“孪生”小部件中的某些内容。如果我们有一个构建小部件的功能,我们只能在一个地方完成它,否则我们将查看代码并在几个地方进行更改李>
- 有时,使用什么小部件取决于某些逻辑。最好在函数中的某个地方隔离此逻辑,而不是将此逻辑放在小部件树中,否则会使代码和小部件树复杂化,从而给处理带来困难李>
- 使代码可读和干净。如果你有一个巨大的小部件树,很难找到一些小部件,你需要花一些时间来找到你正在寻找的小部件的确切位置。很容易理解它是什么小部件,因为现在它有了一个名称。等等此外,当一个小部件树很复杂时,很难阅读和处理它李>
- 有时小部件可以在小部件树中使用多次(有时略有不同),因此我们不必复制所有代码,只需参考预先设置的小部件抛出小部件构建函数即可。让我们想象一下,在这种情况下,我们需要更改“孪生”小部件中的某些内容。如果我们有一个构建小部件的功能,我们只能在一个地方完成它,否则我们将查看代码并在几个地方进行更改李>
- 有时,使用什么小部件取决于某些逻辑。最好在函数中的某个地方隔离此逻辑,而不是将此逻辑放在小部件树中,否则会使代码和小部件树复杂化,从而给处理带来困难李>
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
),
);
}
}