【问题标题】:Stateless Vs Stateful rebuild无状态与有状态重建
【发布时间】:2026-01-08 13:00:01
【问题描述】:

当无状态小部件位于有状态小部件中时,它是否会重绘? 现在无状态小部件不能在运行时重绘,但有状态的可以。 问题是当无状态小部件位于有状态小部件中时,它是否会被重绘?

【问题讨论】:

    标签: flutter dart mobile flutter-widget


    【解决方案1】:

    如果statefulWidget 重建,将重建childchildstatelessWidget。基本上,当在statefulWidget 中调用setState 时,旧状态被丢弃,构建方法以新状态运行。因此,如果 statelessWidget 它在 statefulWidgetbuild 方法中引用,是的,它将被重建。

    import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: MyHomePage(),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      @override
      Widget build(BuildContext context) {
        print('Stateful widget built');
        return Scaffold(
          appBar: AppBar(
            title: Text('Example'),
          ),
          body: BodyWidget(),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              setState(() {});
            },
            tooltip: 'Set state',
            child: Icon(Icons.add),
          ),
        );
      }
    }
    
    class BodyWidget extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        print('Stateless widget built');
        return Container(
          child: Text('Stateless widget'),
        );
      }
    }
    

    试试这个例子,当你点击 Fab 时,它会在 statefulWidget 上返回 setState,当每个构建方法运行时,你会在控制台中得到一个打印输出。

    【讨论】:

    • 如果无状态小部件具有相同的键,我相信会有一些优化。
    • 如果您不想重建无状态小部件,那么与消费者或选择器一起使用的提供程序(例如提供程序)也可以提供一些优化。