Flutter:有状态的小部件不更新

Posted

技术标签:

【中文标题】Flutter:有状态的小部件不更新【英文标题】:Flutter: Stateful Widget does not update 【发布时间】:2020-10-20 14:12:18 【问题描述】:

想象一下两个小部件:管理标签栏并因此包含多个小部件的 Main - 和 Dashboard。 在主构造函数上,我创建了第一个仪表板实例和其他带有一些虚拟数据的选项卡栏小部件(同时在 initState 中获取它们)。我用 Futurebuilder 构建 这些。数据到达后,我想创建一个新的仪表板实例,但它不会改变。

class _MainState extends State<HomePage> 
  var _tabs = <Widget>[];
  Future<dynamic> futureData;

  _MainState() 
    _tabs.add(Dashboard(null));
  

  @override
  void initState() 
    super.initState();
    futureData = _getData();
  

  @override
  Widget build(BuildContext context) 
    return FutureBuilder(
        future: futureData,
        builder: (BuildContext context, AsyncSnapshot snapshot) 
          if (snapshot.data != null) 
            tabs[0] = Dashboard(snapshot.data);
           else 
            return CircularProgressIndicator();
          
        );
  

class DashboardScreen extends StatefulWidget 
  final  data;

  DashboardScreen(this.data,
      Key key)
      : super(key: key) 
    print('Dashboard Constructor: ' + data.toString());
  

  @override
  _DashboardScreenState createState() => _DashboardScreenState(data);



class _DashboardScreenState extends State<DashboardScreen> 
  var data;

  _DashboardScreenState(this.data);

  @override
  void initState() 
    super.initState();
    print('InitState: ' + data.toString());
  

  @override
  void didUpdateWidget(Widget oldWidget) 
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  

  @override
  void didChangeDependencies() 
    super.didChangeDependencies();
    print('didChangeDependencies' + data.toString());
  

  @override
  Widget build(BuildContext context) 
    return Text(data.toString());
  

当我在几个可用的方法上打印时,很明显 DasboardScreenState 没有重新创建。数据到达时仅再次调用 DashboardScreen 构造函数,而不是它的状态...

flutter: MainConstructor: null

flutter:仪表板构造函数:null

颤动:InitState:空

颤振:didChangeDependencies:空

flutter: Dashboard Constructor: MachineStatus.Manual

如何强制国家重建?我尝试将 key 参数与 UniqueKey() 一起使用,但没有奏效。尽管我不知道如何在我的用例中使用它,但继承的小部件似乎也不是解决方案,因为子项仅在 ..ScreenState 中可用,但在更新后的数据中不可用..

我可以想象通过使用 Stream 来通知 dashboardScreenState:听消息,然后调用 setState() - 我认为,但这只是一种解决方法。

谁能帮帮我:)?

【问题讨论】:

【参考方案1】:

我知道我之前遇到过 if 语句的问题,请尝试:

return FutureBuilder(
    future: futureData,
    builder: (BuildContext context, AsyncSnapshot snapshot) 
      if (snapshot.hasData)  //use hasData
        DataType data  = snapshot.data; //Declare Values first
        tabs[0] = Dashboard(data);
       else 
        return CircularProgressIndicator();
      
    );

【讨论】:

您不能在构建中调用 setState() 或 markNeedsBuild()。已经试过了.. 我已经修改了我的答案 - 看看 仍然无法正常工作:/ 我还尝试将快照数据分配给 main 中的局部变量,并将它们传递到 Dashboard 的第一个和第二个实例中。这样第一个实例获取空值,第二个实例获取接收到的数据。也不行..

以上是关于Flutter:有状态的小部件不更新的主要内容,如果未能解决你的问题,请参考以下文章

Flutter ListView 与 List 中的小部件不会在应该更新时更新

当 Flutter 中的全局变量更改(异步)时更新小部件

Flutter:如何将图像(裁剪)放入下一个有状态/更少的小部件

用于从 REST API 获取状态并自动刷新的小部件的 Flutter 食谱?

Flutter/Dart:将参数传递给有状态的小部件?

Flutter - setState 不更新内部有状态小部件