前言
随着移动应用的日益复杂,状态管理成为了 flutter 应用开发中的一项重要挑战。
状态,即应用中的可变数据,它驱动着用户界面的渲染和交互。
在 flutter 这样的声明式 ui 框架中,如何高效、可维护地管理状态,对于构建高性能、用户友好的应用至关重要。
flutter 框架提供了多种内置机制来帮助开发者管理状态,如 statefulwidget 和 setstate。
然而,随着应用规模的扩大,这些基础机制可能不足以满足复杂状态管理的需求。
因此,社区涌现出了许多优秀的状态管理库和模式,如 provider、bloc、redux、mobx 和 getx 等。
本文将着重介绍原生的 statefulwidget 和 setstate。
优缺点
基础介绍:
setstate 是 flutter 中最基础的状态管理方法,适用于 statefulwidget。
当调用 setstate 方法时,flutter 会重新构建该 statefulwidget 的 build 方法,并传递最新的状态对象,从而更新 ui。
优点:
(1)简单直观:statefulwidget 和 setstate 是 flutter 框架内置的,不需要额外安装库或包。
(2)性能较好:在需要更新 ui 时,只重新构建受影响的 widget 部分,而不是整个应用。
缺点:
(1)代码耦合度高:业务逻辑和 ui 代码紧密耦合在一起,不利于维护和扩展。
(2)跨组件状态共享困难:setstate 只能更新当前 widget 的状态,跨组件共享状态需要手动传递状态对象,导致代码冗余和复杂性增加。
使用方式
在 flutter 中,statefulwidget 是一个可以改变其状态的 widget。
当你需要让你的 widget 在运行时根据用户交互或其他事件改变其外观或行为时,statefulwidget 就显得非常有用。
setstate 方法是 statefulwidget 的核心,它用于通知 flutter 框架状态已经改变,从而触发 widget 的重建。
使用步骤
1、创建一个 statefulwidget 类
创建一个继承自 statefulwidget 的类。在这个类中,你需要创建一个 state 类的实例,这个 state 类将持有 widget 的状态。
2、创建一个 state 类
创建一个继承自 state<t> 的类,其中 t 是你在第一步中创建的 statefulwidget 类的类型。在这个类中,你可以定义变量来存储 widget 的状态,并可以重写 build 方法来构建 widget。
3、在 state 类中调用 setstate:
当你需要更新 widget 的状态时,可以在 state 类中调用 setstate 方法。
setstate 方法接受一个函数作为参数,这个函数用于更新状态。
调用 setstate 后,flutter 框架会调用 build 方法来重新构建 widget,从而反映新的状态。
完整示例
下面是一个简单的例子,展示了如何使用 statefulwidget 和 setstate 来创建一个计数器:
代码如下:
import 'package:flutter/material.dart';
void main() {
runapp(myapp());
}
class myapp extends statelesswidget {
widget build(buildcontext context) {
return materialapp(
home: counterwidget(),
);
}
}
class counterwidget extends statefulwidget {
_counterwidgetstate createstate() => _counterwidgetstate();
}
class _counterwidgetstate extends state<counterwidget> {
int _counter = 0;
void _incrementcounter() {
setstate(() {
_counter++;
});
}
widget build(buildcontext context) {
return scaffold(
appbar: appbar(
title: text('counter'),
),
body: center(
child: column(
mainaxisalignment: mainaxisalignment.center,
children: <widget>[
text(
'you have pushed the button this many times:',
),
text(
'$_counter',
style: theme.of(context).texttheme.headline4,
),
],
),
),
floatingactionbutton: floatingactionbutton(
onpressed: _incrementcounter,
tooltip: 'increment',
child: icon(icons.add),
),
);
}
}
运行结果如下

发表评论