【问题标题】:Flutter - Update parent state from childFlutter - 从孩子更新父状态
【发布时间】:2018-07-13 10:30:02
【问题描述】:

我无法从孩子更新父状态。子小部件有一个名为“onDragEnd”的回调,一旦网格单元上的拖放操作完成,就会调用该回调。此时父级(网格)应根据项目新排序重建 UI,但没有任何反应。如果我在“setState()”之前设置断点,则“elems”属性包含正确排序的正确项目。即使我替换了整个列表,UI 也不会更新。有什么建议么?我错过了什么?

class _CustomGridState extends State<CustomGrid> { 

    List<Pack> elems;

    _CustomGridState(this.elems);

    @override
    Widget build(BuildContext context) {
         return GridView.count(
                crossAxisCount: 3,
                children: this
                  .elems
                  .map((pack) => PackFingernail(pack: pack,

                       onDragEnd: (Pack source, Pack target) {

                            var sourceIndex = this.elems.indexWhere((p) => p.id == source.id);
                            var targetIndex = this.elems.indexWhere((p) => p.id == target.id);

                            this.elems.removeAt(sourceIndex);
                            this.elems.insert(targetIndex, source);

                            setState(() {}); // Not working <-----
                       })

                   ).toList()
               );
   }
 }

【问题讨论】:

  • PackFingernail 是有状态的小部件?
  • 是的,它是一个有状态的小部件,它管理着它的内部状态

标签: dart flutter state


【解决方案1】:

尝试为您的PackFingernail添加密钥

// constructor    
PackFingernail(..., {Key key}): super(key:key)

// in gridview
.map((pack) => PackFingernail(pack: pack,
 onDragEnd: (Pack source, Pack target) {
    ...
 },
 key: Key(pack.id.toString()))
).toList()

Key可以帮助重建GridView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多