📜  Flutter无状态和有状态 Widget 的区别

📅  最后修改于: 2021-09-02 05:35:44             🧑  作者: Mango

众所周知, flutter应用程序仅由小部件组成,这些小部件大致分为两种类型:

  1. 无状态小部件
  2. 有状态小部件

状态:

在了解无状态和有状态小部件之间的区别之前,我们应该先看看小部件状态的定义。

简单来说,widget 的状态是其属性(参数)在其创建时(当widget 在屏幕上绘制时)所持有的对象的信息。状态也可以在使用时改变,例如 RaisedButton 小部件的颜色在按下时可能会改变。

无状态小部件:

 无状态小部件是不会改变的小部件,即它们是不可变的。它的外观和属性在小部件的整个生命周期中保持不变。简而言之,无状态小部件在应用程序运行期间无法更改其状态,这意味着在应用程序运行时无法重绘小部件。
示例: Icon、IconButton 和 Text 是无状态小部件的示例。
要创建无状态小部件,我们必须覆盖下面代码中实现的 build() 方法。

Dart
import 'package:flutter/material.dart'
void main() = > runApp(GeeksforGeeks())
 
 
class GeeksforGeeks extends StatelessWidget {
    @override Widget build(BuildContext context)
    {return MaterialApp(
        home: Scaffold(
            backgroundColor: Colors.grey,
            appBar: AppBar(backgroundColor: Colors.green,
                           title: Text("GeeksforGeeks"), ),
            body: Container(child: Center(child: Text("Stateless Widget"),
                                          ),
                            ),
        ),
    )
    }}


Dart
import 'package:flutter/material.dart'
void main() = > runApp(MyApp())
 
 
class MyApp extends StatelessWidget {
  @override Widget build(BuildContext context)
  {return MaterialApp(theme: ThemeData(
    primarySwatch: Colors.green, ),
                      home: MyHomePage(title: 'GeeksforGeeks'),
                     )}}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}): super(key: key)


输出 :

有状态小部件:

有状态小部件是在运行时更改其属性的小部件。它们是动态的,即它们是可变的,并且可以在其生命周期内多次绘制。它可以响应用户交互触发的事件或接收数据时更改其外观。
示例: Checkbox、Radio Button、 SliderInkWell 、Form 和TextField是有状态小部件的示例。
要创建有状态小部件,我们必须覆盖createState () 方法,该方法返回小部件的状态。

Dart

import 'package:flutter/material.dart'
void main() = > runApp(MyApp())
 
 
class MyApp extends StatelessWidget {
  @override Widget build(BuildContext context)
  {return MaterialApp(theme: ThemeData(
    primarySwatch: Colors.green, ),
                      home: MyHomePage(title: 'GeeksforGeeks'),
                     )}}
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}): super(key: key)

输出 :

无状态和有状态小部件之间的差异:

无状态小部件:

  • 无状态小部件是静态小部件。
  • 它们不依赖于任何数据更改或任何行为更改。
  • Stateless Widgets 没有状态,它们会被渲染一次并且不会自我更新,只会在外部数据发生变化时更新。
  • 例如:Text、Icon、 RaisedButton是无状态小部件。

有状态小部件:

  • 有状态小部件是动态小部件。
  • 它们可以在运行时根据用户操作或数据更改进行更新。
  • 有状态的 Widget 有一个内部状态,如果输入数据发生变化或者 Widget 的状态发生变化,它可以重新渲染。
  • 例如:复选框、单选按钮、滑块是有状态的小部件