如何从另一个小部件更改有状态小部件的变量?

Posted

技术标签:

【中文标题】如何从另一个小部件更改有状态小部件的变量?【英文标题】:How to change variable of a stateful widget from another widget? 【发布时间】:2021-12-26 07:25:13 【问题描述】:

如何从另一个小部件更改一个小部件的变量? 这是名为HomePage 的主要有状态小部件:

class _HomePageState extends State<HomePage> 
  @override
  num counter = 0;

  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(title: Text("Title")),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [Text(counter.toString()), CardWidget()],
          ),
        ));
  

这是添加到HomePageCardWidget

class CardWidget extends StatefulWidget 
  const CardWidget(Key? key) : super(key: key);

  @override
  _CardWidgetState createState() => _CardWidgetState();


class _CardWidgetState extends State<CardWidget> 
  @override
  Widget build(BuildContext context) 
    return Card(
        child: Column(
      children: [
        Text("Press the button to increment the counter"),
        ElevatedButton(
          onPressed: () 
            //Something here to increment the counter in HomePage
          ,
          child: const Text('Increment'),
        ),
      ],
    ));
  

这是屏幕上显示的内容:

是否可以在两个小部件之间创建连接:如果我点击按钮,主页小部件中会发生某些事情? (类似于 UIKit 中的委托)

【问题讨论】:

请同时发布您的 HomePage 课程。 使用ValueNotifierValueListenableBuilder。查看我对类似问题的回答here。 【参考方案1】:

您可以传递Function 参数。 在您的CardWidget 中添加Function 参数。

class CardWidget extends StatefulWidget 
  //Add clicked function
  final Function onClicked;
  const CardWidget(Key? key, required this.onClicked) : super(key: key);

  @override
  _CardWidgetState createState() => _CardWidgetState();


class _CardWidgetState extends State<CardWidget> 
  int _count = 0;
  @override
  Widget build(BuildContext context) 
    return Card(
        child: Column(
      children: [
        Text("Press the button to increment the counter"),
        ElevatedButton(
          onPressed: () 
            //Something here to increment the counter in HomePage
            //Execute `onClicked` and pass parameter you want
            _count++;
            widget.onClicked(_count);
          ,
          child: const Text('Increment'),
        ),
      ],
    ));
  

然后在HomePage上添加onClicked参数

class _HomePageState extends State<HomePage> 
  @override
  num counter = 0;

  Widget build(BuildContext context) 
    return Scaffold(
        appBar: AppBar(title: Text("Fontanelle")),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
               Text(counter.toString()),
               CardWidget(
                //Add onClicked
                 onClicked:(count)
                    print("Clicked "+count.toString());
                 
               )
            ],
          ),
        ));
  

【讨论】:

【参考方案2】:

对于这种情况,你有一些解决方案:

1、为StatefullWidget创建GlobalKey,即可从HomePage访问State

2、从Homepage创建Stream并传递给StatefullWidget

3、将参数传递给StatefullWidget并在状态上使用didUpdateWidget进行监听。

【讨论】:

【参考方案3】:

我记得这是我的第一个问题,我的第一步是什么时候开始的,@dangngocduc 是真的,但我的建议是阅读关于 BLOC 的信息

https://pub.dev/packages/flutter_bloc

这样做非常有帮助。

【讨论】:

以上是关于如何从另一个小部件更改有状态小部件的变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过引用有状态小部件来传递数据?我想更改有状态小部件中的变量并更新原始变量

从另一个小部件更改一个小部件中的状态

如何从另一个小部件设置状态?

如何从另一个小部件状态处理一个小部件状态?

如何从另一个 dart 文件中调用有状态小部件(有表单)方法?- Flutter

从另一个有状态小部件调用一个有状态小部件中的方法 - Flutter