我有一个在页面上保持状态的Flutter小部件。在它离开视线后,它就被处理掉了,它的状态也随之消失了。在再次向上滚动之后,它将以其初始状态重新创建,这是无意的。
我找不到任何信息颤振如何决定它是否处置一个小部件。那么,一个颤振部件什么时候会被处理掉?
当小部件不再运行时,它调用dispose方法。当该状态不再在UI上使用时的简单方法。这取决于您在哪里使用这些statfullwidgets。
像Listview.builder
一样,它只呈现可见的小部件+顶部和底部的一部分。在这里,如果创建了小部件,其余的小部件将被处理掉。您也可以与Listview
核对。
另一种情况是,当我们用SingleChildScrollView
包装所有东西时,它将在最后处理所有小部件。要了解更多信息,请访问这些链接并测试这个小部件(您可以尝试dev-tools)。
dispose
当该对象从树中永久移除时调用。
当State对象不再构建时,框架调用此方法。在框架调用dispose之后,State对象被认为是未装载的,并且已装载的属性为false。此时调用setState是错误的。生命周期的这个阶段是结束的:没有办法重新挂载已被处置的State对象…
更多信息请访问
<<ul>测试部件
class MainScreen extends StatefulWidget {
MainScreen({Key? key}) : super(key: key);
@override
_MainScreenState createState() => _MainScreenState();
}
class _MainScreenState extends State<MainScreen> {
final items = List.generate(
23,
(index) => Sub1(
subNo: index,
key: UniqueKey(),
),
);
@override
Widget build(BuildContext context) {
return Scaffold(
body: SingleChildScrollView(
child: Column(
children: items,
),
),
// ListView.builder(
// itemCount: 20, itemBuilder: (context, index) => items[index]),
);
}
}
class Sub1 extends StatefulWidget {
final int subNo;
const Sub1({
Key? key,
required this.subNo,
}) : super(key: key);
@override
_Sub1State createState() => _Sub1State();
}
class _Sub1State extends State<Sub1> {
@override
void initState() {
super.initState();
print("init Sub ${widget.subNo}");
}
@override
void dispose() {
print("dispose Sub ${widget.subNo}");
super.dispose();
}
@override
Widget build(BuildContext context) {
return Container(
height: 200,
color: widget.subNo.isEven ? Colors.deepPurple : Colors.deepOrange,
alignment: Alignment.center,
child: Text("Sub ${widget.subNo}"),
);
}
}