You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将UpdateWidget转为独立Stateful Widget并实现参数传递与状态更新

实现独立Stateful Widget并完成父子组件状态同步

父组件代码

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('父子组件状态同步示例')),
        body: const ParentWidget(),
      ),
    );
  }
}

class ParentWidget extends StatefulWidget {
  const ParentWidget({super.key});

  @override
  State<ParentWidget> createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  String displayText = '';
  String switchText = '';

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          // 触发displayText更新的按钮组
          Row(
            children: [
              ElevatedButton(
                onPressed: () => setState(() => displayText = '水果'),
                child: const Text('选择水果'),
              ),
              const SizedBox(width: 10),
              ElevatedButton(
                onPressed: () => setState(() => displayText = '蔬菜'),
                child: const Text('选择蔬菜'),
              ),
            ],
          ),
          const SizedBox(height: 20),
          // 展示最终选择结果
          Text('已选择:$switchText', style: const TextStyle(fontSize: 16)),
          const SizedBox(height: 20),
          // 引入独立子组件,传递参数和回调
          ChildButtonWidget(
            displayText: displayText,
            onSelect: (value) => setState(() => switchText = value),
          ),
        ],
      ),
    );
  }
}

独立子组件代码(原updateWidget改造)

class ChildButtonWidget extends StatefulWidget {
  // 接收父组件传入的displayText,用于判断渲染内容
  final String displayText;
  // 定义回调函数,用于将子组件的选择结果传递给父组件
  final ValueChanged<String> onSelect;

  const ChildButtonWidget({
    super.key,
    required this.displayText,
    required this.onSelect,
  });

  @override
  State<ChildButtonWidget> createState() => _ChildButtonWidgetState();
}

class _ChildButtonWidgetState extends State<ChildButtonWidget> {
  @override
  Widget build(BuildContext context) {
    switch (widget.displayText) {
      case '水果':
        return Row(
          children: [
            ElevatedButton(
              onPressed: () => widget.onSelect('苹果'),
              child: const Text('苹果'),
            ),
            const SizedBox(width: 10),
            ElevatedButton(
              onPressed: () => widget.onSelect('香蕉'),
              child: const Text('香蕉'),
            ),
          ],
        );
      case '蔬菜':
        return Row(
          children: [
            ElevatedButton(
              onPressed: () => widget.onSelect('白菜'),
              child: const Text('白菜'),
            ),
            const SizedBox(width: 10),
            ElevatedButton(
              onPressed: () => widget.onSelect('萝卜'),
              child: const Text('萝卜'),
            ),
          ],
        );
      default:
        return const Text('请先选择分类');
    }
  }
}

核心逻辑说明

  • 子组件ChildButtonWidget通过构造函数接收两个关键参数:displayText用于判断要渲染的子按钮组,onSelect是回调函数,负责将子按钮的选择结果传递给父组件。
  • 父组件在初始化子组件时,传入onSelect回调,在回调内部调用setState更新自身的switchText状态,从而实现子组件驱动父组件状态更新的效果。
  • 子组件内部通过widget.displayText获取父组件传入的参数,通过switch/case渲染对应按钮组,点击按钮时调用widget.onSelect传递选中的文本内容。

内容的提问来源于stack exchange,提问作者Nomad09

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:05:38