在 flutter 中强制重建有状态子部件

2024-06-20

假设我有一个主屏幕(有状态小部件),其中有一个变量count作为状态。在此主屏幕中,有一个按钮和另一个有状态小部件(我们称之为MyListWidget. MyListWidget初始化它自己的小部件initState取决于的值count多变的。显然如果你改变的值count并打电话SetState,什么都不会发生MyListWidget因为它创造了价值initState。我怎样才能强制重建MyListWidget? 我知道在这个例子中我们可以移动我们在initState in the build方法。但在我真正的问题中,我无法移动我在其中所做的事情initState in the build method.

这是完整的代码示例:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key? key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int count = 5;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Row(
      children: [
        Expanded(
          child: MaterialButton(
            child: Text('Click me'),
            color: Colors.red,
            onPressed: () {
              setState(() {
                count++;
              });
            },
          ),
        ),
        MyListWidget(count),
      ],
    ));
  }
}

class MyListWidget extends StatefulWidget {
  final int count;

  const MyListWidget(this.count, {Key? key}) : super(key: key);

  @override
  _MyListWidgetState createState() => _MyListWidgetState();
}

class _MyListWidgetState extends State<MyListWidget> {
  late List<int> displayList;

  @override
  void initState() {
    super.initState();
    displayList = List.generate(widget.count, (int index) => index);
  }

  @override
  Widget build(BuildContext context) {
    return Expanded(
      child: ListView.builder(
        itemBuilder: (BuildContext context, int index) => ListTile(
          title: Text(displayList[index].toString()),
        ),
        itemCount: displayList.length,
      ),
    );
  }
}


我认为接受的答案不准确,Flutter将保留以下状态MyListWidget因为它与以前的类型相同,并且在小部件树中的位置相同。

相反,强制重建小部件更改其密钥 https://jelenaaa.medium.com/how-to-force-widget-to-redraw-in-flutter-2eec703bc024:

class _MyHomePageState extends State<MyHomePage> {
  int count = 5;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Row(
        children: [
          Expanded(
            child: MaterialButton(
              child: Text('Click me'),
              color: Colors.red,
              onPressed: () {
                setState(() {
                  count++;
                });
              },
            ),
          ),
          MyListWidget(count, key: ValueKey(count)),
        ],
      ),
    );
  }
}

Using a ValueKey在这个例子中意味着只有在以下情况下才会重新创建状态count实际上是不同的。

或者,您可以监听小部件的变化State.didUpdateWidget https://api.flutter.dev/flutter/widgets/State/didUpdateWidget.html,您可以在其中比较当前this.widget随着传入的oldWidget并在必要时更新状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 flutter 中强制重建有状态子部件 的相关文章

  • Dart 2.2 之后如何设置文字

    直到 2 2 才支持设置文字 如何在 Dart 2 2 之后设置文字 请随意发表评论 谢谢 class item t String name int weight int value main const List
  • 在 flutter 中强制重建有状态子部件

    假设我有一个主屏幕 有状态小部件 其中有一个变量count作为状态 在此主屏幕中 有一个按钮和另一个有状态小部件 我们称之为MyListWidget MyListWidget初始化它自己的小部件initState取决于的值count多变的
  • CORS 与 Dart,如何让它发挥作用?

    刚开始摆弄 Dart 我决定编写一个简单的 Http 服务器和客户端 我的服务器代码 import dart io final HOST 127 0 0 1 final PORT 8080 final LOG REQUESTS true v
  • Flutter/Dart:将十六进制颜色字符串转换为颜色?

    我们的数据库将颜色保存为String就像 AABBCC 所以我基本上正在寻找这样的函数 Color parseColor AABBCC 对于颤振 Color 类需要这样的东西Color 0xFF42A5F5 所以我需要转换 AABBCC t
  • Flutter - 更改 SearchDelegate 的搜索提示文本

    目前实施中SearchDelegate 没有更改提示文本的选项 当查询为空时 将显示搜索屏幕 Search 在查询字段中作为提示文本 提示文本当前在第 395 行定义如下 final String searchFieldLabel Mate
  • 在 flutter 中用 2 张图像设计背景

    我想创建一个新的无状态小部件类 它由 2 个图像 顶部 底部 和一条线 由函数定义 例如 x x 500 宽度 如果不应该绘制的话可以为 0 和颜色 分隔两个图像 对于每个像素 如果像素的 y 位置大于结果f x width 2底部的一个像
  • 如何设置 Flutter CameraPreview 大小“全屏”

    我正在使用相机预览来测量物体的高度 但问题是我无法全屏设置相机预览高度 我努力了定位小部件 它充满了屏幕 但图像被拉伸 我努力了变换小部件 但高度没有填满全屏 出现空白 图像没有拉伸 Mycode final size MediaQuery
  • Flutter插件:从Android BroadcastReceiver发送数据到Flutter代码

    我正在开发一个 Flutter 插件 仅适用于 Android 当设备连接到特定的蓝牙设备时 它会自动执行 Flutter 任务 这是我在中所做的Android插件侧面 在清单中 我注册了一个BroadcastReceiver监听蓝牙事件
  • Flutter中FloatingActionButton的渐变背景

    是否可以将FAB的背景颜色设置为渐变而不是纯色 我的按钮 floatingActionButton FloatingActionButton backgroundColor const Color 0xFFFF006E child cons
  • 如何在flutter中准备字符串变量格式? [复制]

    这个问题在这里已经有答案了 我想将 Roll no 传递给我的其余 API 吗 我想通过 Roll no 像这样的格式 String roll no 3250 10 如何准备这个格式 我在 3250 和 10 之间添加了 但它给出了类似 E
  • 如何在 Flutter 中将列表从一个类传递到另一个类?

    所以我有一个列表 我在一个屏幕上添加数据 每次单击某个按钮时 然后 我有一个底部导航栏 它允许我在屏幕之间切换 因此也没有弹出或推送路线 我的问题是我有两个屏幕 我想从第二个状态类中的第一个状态类访问列表 带有列表的类 class Secu
  • 如何解决颤动错误中的“作为前缀”

    The name LocationAccuracy is defined in the libraries package geolocation geolocation dart package geolocator geolocator
  • Flutter 动画:使用 opencontainer 进行 showSearch

    在颤振中animations包 使用容器变换动画的案例之一是 扩展搜索的搜索栏 现在显示扩展搜索的常用方法是使用showSearch函数 我唯一知道修改搜索动画是通过搜索委托 有什么办法可以使用吗openContainer with sho
  • Flutter:热重载后被发送回初始页面

    我在用颤振模块将我的应用程序分离到某个模块中 一切看起来都很好 直到我注意到每次执行热重载时 我的应用程序都会自动跳回到登录页面哪个 也是最初的 这是我的设置 class AppWidget extends StatelessWidget
  • Flutter:后台中的 SVG 图像抛出错误

    我必须将 SVG 图像保留在背景中并将文本保留在顶部 当我保留 Flutter SVG 包中的 SVG 图像时 出现了这样的错误 I flutter 24437 Unsupported operation Could not resolve
  • 在 Flutter 中播放自定义声音

    我正在尝试播放自定义 mp3 声音 我已将资源文件夹放入应用程序文件夹中 就像对字体或图像文件所做的那样 但我真的不知道如何继续 我想我可能需要将音频文件注册到 pubspec yaml 中 但是如何注册呢 我该如何玩它 我已经检查了这两个
  • 如何使 Flutter 应用字体大小独立于设备设置?

    我需要使我的整个应用程序独立于设备的字体大小设置 我发现我可以设置textScaleFactor 1 0手动为每个文本视图 对于一些文本小部件来说 这是一个很好的解决方案 但对于具有数十个文本小部件的大型应用程序来说 这并不好 首先 我必须
  • 如何将 List 转换为 List

    我有一个记录类来解析来自 Firestore 的对象 我的课程的精简版本如下所示 class BusinessRecord BusinessRecord fromMap Map
  • Flutter MissingPluginException 错误

    我正在尝试通过 Android Studio 中的 Flutter 在我的 S7 Edge Android 7 上运行 QR 码阅读器应用程序 这是示例代码的链接 https pub dartlang org packages qrcode
  • Dart 中 ~ 是什么意思?

    在 Dart 的一些代码示例中看到了波形符 我见过它在 C 中用作析构函数 可以调用它来删除对象的实例 它在 Dart 中具有相同的功能吗 Java中有等效的符号吗 Dart 不支持析构函数 https www dartlang org g

随机推荐

  • 使用带有 prism 的 MVVM 在视图之间进行更改

    我是 WPF 新手 但根据我所读到的内容 构建应用程序的正确方法是在同一窗口上切换视图 我的意思是类似于带有菜单和显示视图的工作区的 框架 到目前为止我一直在关注这个http jesseliberty com 2011 01 06 wind
  • 如何从 TeamCity 提取工件?

    我想从 teamcity 中提取工件 我一直在尝试使用 c 和 HtmlAgilityPack 访问网站并查找最新版本及其工件 我目前陷入登录困境 我想我只需要发送会话 Cookie 即可 我的方向正确吗 还有其他人尝试过吗 我意识到使用构
  • 如何为从源文件编译的应用程序分配自定义图标?

    在我的程序中 我使用 CSharpCodeProvider 来从源文件编译另一个应用程序 我使用的代码如下 public static bool CompileExecutable String sourceName FileInfo so
  • 最小化代表性整数的误差之和

    Given n integers between 0 10000 as D1 D2 Dn where there may be duplicates and n can be huge I want to find k distinct r
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • NSTextField 字体样式在选择时重置

    Context 在 Interface Builder 中 我有一个不可编辑的标签 NSTextField 标签的内容是使用 Cocoa Bindings 创建的 绑定的值是NSAttributedString 使用数值转换器创建 看图片
  • ASP.NET预编译的优点是什么?

    使用 Aspnet compiler exe 代替通过 Visual Studio 进行的传统发布有多有用 那么资源 resx 文件又如何呢 与简单的 xcopy 相比 预编译有两个主要优点 文件系统不会包含所有代码 aspx文件和后面的所
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 如何使指针指向二维数组的任意数组元素?

    言归正传 我想要字符指针p指向唯一包含字符 的数组元素T char a 100 100 char p for int i 0 i lt 4 i for int j 0 j lt 4 j if a i j T p a i j 附 我尝试了各种
  • 如何从模拟器启动中删除“-no-boot-anim”标志?

    我正在使用 VS 15 4 预览版 2 来测试 Android 8 0 的一些功能 我正在尝试将我的应用程序启动 调试 到 AVD 模拟器中 但打开后模拟器窗口中出现空白黑屏 我注意到从 VS 输出打开模拟器的命令是 2 gt Starti
  • Windows:更改与文件类型关联的应用程序的名称/图标

    我想将 Windows 中的文件类型与特定应用程序相关联 但我需要这样做 以便当用户打开 打开方式 菜单时 列表中应用程序的名称和图标是针对该文件类型自定义的 即 不仅仅是可执行文件的名称和图标 这是因为该二进制文件是一个通用二进制文件 可
  • 如何将 InputScope 属性添加到 WinRT 中的 PasswordBox?

    如何将输入范围属性添加到我的用户控件的密码框 请你给我解释一下好吗 Thanks 根据我掌握的信息 PasswordBox 在 winrt 中没有输入范围属性 因此您无法直接设置它 如果你想这样做 你必须制作单独的自定义控件 要定义您自己的
  • 使用 JavaScript 使链接保持活动状态并在单击时显示悬停效果

    I am struggling to make this work I d like to make it where if O F is clicked the hover state stays active if another li
  • 多处理器机器中秒表的最佳实践?

    我找到了一个好的question https stackoverflow com questions 28637 is datetime now the best way to measure a functions performance
  • PHPUnit 在 IDE 中工作,但服务器说找不到类

    我在 PhpStorm 中使用 Symfony3 插件 我的 PHP 解释器是 7 0 18 我在 PhpStorm 中配置了 PHPUnit 6 3 0 phar文件位于我的项目的根目录中 单元测试就像 IDE 中的魅力一样工作 但在服务
  • 最小的有效 PDF 是多少?

    出于简单的好奇心 看到了最小的 GIF http probablyprogramming com 2009 03 15 the tiniest gif ever 最小的有效 PDF 文件是多少 这是一个有趣的问题 按照书本 你可以从以下开始
  • matplotlib 图中点的标签

    所以这是一个关于已发布的解决方案的问题 我试图在我拥有的 matplotlib 散点图中的点上放置一些数据标签 我试图在这里模仿解决方案 是否有与 MATLAB 的 datacursormode 等效的 matplotlib https s
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Windows 上良好的 Oracle 数据库开发和管理工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找像 sql server management studio 这样的 Oracle 数据库管理工具 我在互联网上搜索并在以下链接
  • 在 flutter 中强制重建有状态子部件

    假设我有一个主屏幕 有状态小部件 其中有一个变量count作为状态 在此主屏幕中 有一个按钮和另一个有状态小部件 我们称之为MyListWidget MyListWidget初始化它自己的小部件initState取决于的值count多变的