Flutter 当从有状态子级调用时,flatter setState()不刷新小部件

Flutter 当从有状态子级调用时,flatter setState()不刷新小部件,flutter,Flutter,我有两个有状态的小部件:ParentWidget和ChildWidget ChildWidget有一个包裹容器和文本的手势检测器。调用onTap时,父级的状态(状态增加1)会正确更新,但setState()不会刷新UI。 我什么都试过了:全局键,继承的小部件,但都没用 有趣的是,如果我将ChildWidget更改为无状态widget,那么一切都开始工作了。任何想法都会非常有用。 主键 代码如下: import 'package:flutter/material.dart'; import 'pa

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

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

我什么都试过了:全局键,继承的小部件,但都没用

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

代码如下:

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;
  }
}

导入“包装:颤振/材料.省道”;
导入“package:hexcolor/hexcolor.dart”;
类ParentWidget扩展了StatefulWidget{
@凌驾
_ParentWidgetState createState()=>\u ParentWidgetState();
}
类_ParentWidgetState扩展状态{
int状态=1;
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:Colors.white,
appBar:appBar(
背景颜色:Hexcolor(“#1c486d”),
标题:正文(
"测试",,
),
),
正文:ChildWidget(
儿童:手势检测器(
onTap:(){
状态=状态+1;
setState((){});//这是一段有问题的代码。
},
子:容器(
颜色:颜色,蓝色,
宽度:100,
身高:100,
子项:文本('PARENT:'+status.toString()),
),
),
),
);
}
}
类ChildWidget扩展StatefulWidget{
最后一个孩子;
ChildWidget({this.child});
@凌驾
_ChildWidgetState createState()=>\u ChildWidgetState(child);
}
类_ChildWidgetState扩展状态{
小部件儿童;
_ChildWidgetState(this.child);
@凌驾
小部件构建(构建上下文){
返回儿童;
}
}

尽量不要让孩子成为最后一个

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

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

您可以将父对象的
状态
传递给
子窗口小部件
,以便在父对象的
状态
更改时,调用
子窗口小部件
的状态更改及其生成方法

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()),
    );
  }
}
主体:手势检测器(
onTap:(){
设置状态(){
状态=状态+1;
});
},
child:ChildWidget(状态:status),
),
);
}
}
类ChildWidget扩展StatefulWidget{
最终国际地位;
ChildWidget({this.status});
@凌驾
_ChildWidgetState createState()=>\u ChildWidgetState();
}
类_ChildWidgetState扩展状态{
_ChildWidgetState();
@凌驾
小部件构建(构建上下文){
返回容器(
颜色:颜色,蓝色,
宽度:100,
身高:100,
子:文本('PARENT:'+widget.status.toString()),
);
}
}

如果我的answe有用,请接受。谢谢否则让我知道。嗨,根驰,谢谢你的评论。我知道在这个例子中它是无用的,但是这只是我正在研究的一个更复杂的问题中的“救命稻草”,孩子需要有状态。非常感谢lenz-让我试着尽快回来。尝试使它不是最终的-但问题仍然存在。还有其他想法吗?嗨,莫比娜,这真是太好了!非常感谢,这帮我节省了数小时的调查时间。出于好奇,如果我理解正确,如果我重建父级,子级不会重建,因为它是有状态的-并且只有在您建议的修改后,它才会强制重建正确?如果重建父级,子级会重建,但子级(即容器)的子级不会更改。如果不将容器传递给孩子,问题就解决了@PrzemyslawKuznickiThanks又这么说了。是的,这是解决问题的办法。我已将其标记为已回答。快乐编码。