【问题标题】:Flutter setState() not refreshing widget when called from stateful childFlutter setState()从有状态的孩子调用时不刷新小部件
【发布时间】:2020-11-26 14:10:18
【问题描述】:

我有两个有状态的小部件:ParentWidget 和 ChildWidget。

ChildWidget 有一个包含容器和文本的手势检测器。当我调用 onTap 时,父级的状态(状态增加 1)会正确更新,但 setState() 不会刷新 UI。

我尝试了所有方法:全局键、继承的小部件,但没有任何效果。

有趣的是,如果我将 ChildWidget 更改为无状态,那么一切都会开始工作。任何想法都会非常有帮助。 PK

代码如下:

import 'package:flutter/material.dart';
import 'package:hexcolor/hexcolor.dart';

class ParentWidget extends StatefulWidget {
  @override
  _ParentWidgetState createState() => _ParentWidgetState();
}

class _ParentWidgetState extends State<ParentWidget> {
  int status = 1;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Hexcolor('#1c486d'),
        title: Text(
          'Test',
        ),
      ),
      body: ChildWidget(
        child: GestureDetector(
          onTap: () {
            status = status + 1;
            setState(() {}); // this is the problematic piece of code.
          },
          child: Container(
            color: Colors.blue,
            width: 100,
            height: 100,
            child: Text('PARENT:' + status.toString()),
          ),
        ),
      ),
    );
  }
}

class ChildWidget extends StatefulWidget {
  final Widget child;
  ChildWidget({this.child});
  @override
  _ChildWidgetState createState() => _ChildWidgetState(child);
}

class _ChildWidgetState extends State<ChildWidget> {
  Widget child;

  _ChildWidgetState(this.child);

  @override
  Widget build(BuildContext context) {
    return child;
  }
}

【问题讨论】:

  • 如果我的回答有用,请采纳。谢谢。否则请告诉我。
  • 您好 Genchi,感谢您的评论。我知道在这个例子中它是没用的,但这只是我正在研究的一个更复杂的“稻草人”,孩子需要有状态。

标签: flutter


【解决方案1】:

您可以将父级的status 传递给ChildWidget,这样当父级的status 更改时,ChildWidget 的状态发生更改并调用其构建方法。

body: GestureDetector(
        onTap: () {
          setState(() {
            status = status + 1;
          });
        },
        child: ChildWidget(status: status),
      ),
    );
  }
}

class ChildWidget extends StatefulWidget {
  final int status;

  ChildWidget({this.status});
  @override
  _ChildWidgetState createState() => _ChildWidgetState();
}

class _ChildWidgetState extends State<ChildWidget> {
  _ChildWidgetState();

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.blue,
      width: 100,
      height: 100,
      child: Text('PARENT:' + widget.status.toString()),
    );
  }
}

【讨论】:

  • 嗨 Mobina,效果很好!非常感谢它为我节省了数小时的调查时间。出于好奇,所以如果我理解正确,如果我重建父母,孩子不会因为它是有状态的而重建 - 只有你提出的修改才能强制重建正确?
  • 如果你重建父节点,子节点会被重建,但子节点(即容器)的子节点不会改变。如果不将容器传递给孩子,问题就解决了。 @PrzemyslawKuznicki
  • 再次感谢。是的,它解决了。我已将其标记为已回答。编码愉快。
【解决方案2】:

尽量不要让孩子最终

  class ChildWidget extends StatefulWidget {
  Widget child;
  ChildWidget({this.child});

  @override
  _ChildWidgetState createState() => _ChildWidgetState(child);
  } 

【讨论】:

  • 非常感谢 lenz - 让我试着尽快回来。
  • 试图让它不是最终的 - 但问题仍然存在。还有其他想法吗?
猜你喜欢
  • 2018-07-28
  • 2020-10-19
  • 2020-11-28
  • 2021-11-17
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多