赞
踩
StatelessWidget | 无状态的 widget | 如果一个 widget 是最终的或不可变的,那么它就是无状态的 |
---|---|---|
StatefulWidget | 有状态的 widget | 如果一个 widget 会被用户交互或数据导致状态改变,那么它就是有状态的 |
无状态 widget 通常会在 3 种情况下使用:
(1) 将 widget 插入树中时
(2) 当 widget 的父级更改配置时
(3) 当它依赖的 InheritedWidget 发生改变时
代码示例
//无状态 widget class LeonStateLessWidget extends StatelessWidget { final String text; const LeonStateLessWidget({super.key, required this.text}); @override Widget build(BuildContext context) { return Center( child: Text( text, style: const TextStyle(color: Colors.yellow, fontSize: 26), ), ); } }
代码示例
//有状态 widget class LeonStatefulWidget extends StatefulWidget { const LeonStatefulWidget({super.key}); @override State<LeonStatefulWidget> createState() => _LeonStatefulWidgetState(); } class _LeonStatefulWidgetState extends State<LeonStatefulWidget> { var count = 0; @override Widget build(BuildContext context) { return Center( child: Column( children: [ Text('点击次数: $count'), ElevatedButton(onPressed: _onClick, child: const Text('点我')) ], ), ); } void _onClick() { setState(() { count++; }); } }
import 'package:flutter/material.dart'; import 'package:zlzf/widget.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Leon Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: AppBar( title: const LeonStateLessWidget( text: 'Widget 学习', ), ), body: const LeonStatefulWidget() )); } }
每个 widget 管理自己的状态 | 如果所讨论的状态是用户数据,例如复选框的已选中或未选中状态,或滑块的位置,则状态最好由父widget管理 |
---|---|
父 widget 管理 widget 的状态 | 如果widget的状态取决于动作,例如动画,那么最好是由widget自身来管理状态 |
混合搭配管理 | 见机行事 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。