当前位置: 首页 > 面试题库 >

setState不会更新用户界面

漆雕深
2023-03-14
问题内容

我在使用有状态的小部件时遇到了一些与setState函数有关的问题,这些小部件在计时器的帮助下进行了自我更新。
下面的代码显示了2个主要类,它们复制了我如何找到此错误的方法。该文本组件“排版”应该在10秒内插入-这是- ,但它从来没有显示。我试图调试数组“ Items”,并且 在5秒钟后确实包含
“ lorem” Text Widget,这是应该的。“ build”功能可以运行,但在UI中没有任何区别。

class textList extends StatefulWidget {

  @override
  State<StatefulWidget> createState() =>
      new _textListState();
}

class _textListState extends State<textList>
    with TickerProviderStateMixin {

  List<Widget> items = new List();
  Widget lorem = new textClass("Lorem");
  Timer timer;

  @override
  void initState() {
    super.initState();

    items.add(new textClass("test"));
    items.add(new textClass("test"));

    timer = new Timer.periodic(new Duration(seconds: 5), (Timer timer) {
      setState(() {
        items.removeAt(0);
        items.add(lorem);
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
    timer.cancel();
  }

  @override
  Widget build(BuildContext context) {
    Iterable<Widget> content = ListTile.divideTiles(
        context: context, tiles: items).toList();

    return new Column(
      children: content,
    );
  }
}

class textClass extends StatefulWidget {
  textClass(this.word);

  final String word;

  @override
  State<StatefulWidget> createState() =>
      new _textClass(word);
}

class _textClass extends State<textClass>
    with TickerProviderStateMixin {
  _textClass(this.word);

  String word;
  Timer timer;

  @override
  void initState() {
    super.initState();

    timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) {
      setState(() {
        word += "t";
      });
    });
  }

  @override
  void dispose() {
    super.dispose();
    timer.cancel();
  }


  @override
  Widget build(BuildContext context) {
    return new Text(word);
  }
}

这不是我发现此错误的方式,但这是复制它的最简单方法。主要思想是:子文本应该不断更新自身(在这种情况下,最后要添加“ t”),并且在5秒钟后,
应将其最后一个替换为文本小部件“ Lorem”,这会发生什么情况在列表中,但不在用户界面中。


问题答案:

这是怎么回事:

  • A State绝对不能有任何构造函数参数。使用该widget属性可以访问关联的的最终属性StatefulWidget
  • Flutter正在重用您的_textClass实例,因为类名和键匹配。这是一个问题,因为您仅进行了设置widget.wordinitState因此您不会选择新的word配置信息。您可以通过为StatefulWidget实例提供唯一的键来消除它们的歧义并导致旧State的东西被处置来解决此问题,或者可以保留旧的东西State并加以实施didUpdateWidget。后一种方法如下所示。

    import ‘dart:async’;
    import ‘package:flutter/material.dart’;

    void main() {
    runApp(new MaterialApp(
    home: new Scaffold(
    appBar: new AppBar(title: new Text(‘Example App’)),
    body: new textList(),
    ),
    ));
    }

    class textList extends StatefulWidget {

    @override
    State createState() =>
    new _textListState();
    }

    class _textListState extends State list>
    with TickerProviderStateMixin {

    List items = new List();
    Widget lorem = new textClass(“Lorem”);
    Timer timer;

    @override
    void initState() {
    super.initState();

    items.add(new textClass("test"));
    items.add(new textClass("test"));
    
    timer = new Timer.periodic(new Duration(seconds: 5), (Timer timer) {
      setState(() {
        items.removeAt(0);
        items.add(lorem);
      });
    });
    

    }

    @override
    void dispose() {
    super.dispose();
    timer.cancel();
    }

    @override
    Widget build(BuildContext context) {
    Iterable content = ListTile.divideTiles(
    context: context, tiles: items).toList();

    return new Column(
      children: content,
    );
    

    }
    }

    class textClass extends StatefulWidget {
    textClass(this.word);

    final String word;

    @override
    State createState() =>
    new _textClass();
    }

    class _textClass extends State
    with TickerProviderStateMixin {
    _textClass();

    String word;
    Timer timer;

    @override
    void didUpdateWidget(textClass oldWidget) {
    if (oldWidget.word != widget.word) {
    word = widget.word;
    }
    super.didUpdateWidget(oldWidget);
    }

    @override
    void initState() {
    super.initState();
    word = widget.word;

    timer = new Timer.periodic(new Duration(seconds: 2), (Timer timer) {
      setState(() {
        word += "t";
      });
    });
    

    }

    @override
    void dispose() {
    super.dispose();
    timer.cancel();
    }

    @override
    Widget build(BuildContext context) {
    return new Text(word);
    }
    }



 类似资料:
  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下:

  • 我想问一下,为什么在执行事件时,我的状态没有改变。我已经搜索到需要在构造函数中绑定函数,但是状态仍然没有更新。 下面是我的代码:

  • 问题内容: 我想问为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 这个回调真的很混乱。只需使用async await代替:

  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 问题内容: 我想问一下为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 幸运的是, setState进行了回调。这是我们获取更新状态的地方。考虑这个例子。 因此,当回调触发时,this.state是更新后的状态。你可以在回调中获取突变/更新的数据。

  • 我正在尝试使用DidMount中的localStorage值更新状态,但它没有更新: 在第一个console.log中,我的值为1,在第二个中,它保持为空,不更新状态。

  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 我试图将“加载”的状态从true更改为false,但当我调用一个函数并在该函数中设置“this.setState({loading:false})”时,加载状态仍然保持true。 在下面的代码中,当按钮按钮函数被调用时,它将“加载”状态设置为真,但当用户成功登录“加载”状态时,应该变为假,这样我的渲染按钮函数将重新渲染,旋转器可以隐藏自己并显示按钮。 为什么LoginSAccess函数中的“加载”