何时处理颤振部件?



我有一个在页面上保持状态的Flutter小部件。在它离开视线后,它就被处理掉了,它的状态也随之消失了。在再次向上滚动之后,它将以其初始状态重新创建,这是无意的。

我找不到任何信息颤振如何决定它是否处置一个小部件。那么,一个颤振部件什么时候会被处理掉?

当小部件不再运行时,它调用dispose方法。当该状态不再在UI上使用时的简单方法。这取决于您在哪里使用这些statfullwidgets。

Listview.builder一样,它只呈现可见的小部件+顶部和底部的一部分。在这里,如果创建了小部件,其余的小部件将被处理掉。您也可以与Listview核对。

另一种情况是,当我们用SingleChildScrollView包装所有东西时,它将在最后处理所有小部件。要了解更多信息,请访问这些链接并测试这个小部件(您可以尝试dev-tools)。

dispose当该对象从树中永久移除时调用。

当State对象不再构建时,框架调用此方法。在框架调用dispose之后,State对象被认为是未装载的,并且已装载的属性为false。此时调用setState是错误的。生命周期的这个阶段是结束的:没有办法重新挂载已被处置的State对象…

更多信息请访问

<<ul>
  • 处理方法/gh>
  • 为什么我们使用dispose
  • 测试部件

    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}"),
    );
    }
    }
    

    相关内容

    最新更新