在initState上声明时,setState不更新变量

阿文

我遇到了Flutter的一个问题:我有一个问题navbar,根据选择的项目,它会给我返回一个称为Index的整数。然后,该索引通过List传递,以获取Scaffold主体(Widget()的对象)的内容

默认主体是的对象HomePage(),具有一个名为的整数参数rpm默认情况下,HomePage()应该是显示的正文,因此,由于它取决于rpm参数,因此我在rpm声明了该参数initState我也有一个setState动态变化的rpm

奇怪的是:如果我List<Widgets> bodyList在initState中声明in,那setState似乎就不起作用了。但是,如果List<Widgets> bodyList在build方法中声明,则可以使用来HomePage()动态查看更改的内容rpm

代码摘录。无法运作:

class _ScreenTreeState extends State<ScreenTree> {
  int _index;
  int _rpm;
  List<Widget> bodyList;

  @override
  void initState() {
    _isPlaying = false;
    _rpm = 0;
    _index = 0;
    bodyList = [
      HomePage(rpm: _rpm),
      StatisticsScreen(),
      WeightScreen(),
      SettingsPage()
    ];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(...

在职的:

class _ScreenTreeState extends State<ScreenTree> {
  int _index;
  int _rpm;
  List<Widget> bodyList;

  @override
  void initState() {
    _isPlaying = false;
    _rpm = 0;
    _index =
        0;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    bodyList = [
      HomePage(rpm: _rpm),
      StatisticsScreen(),
      WeightScreen(),
      SettingsPage()
    ];
    
    return Scaffold(...

我的理论是,这可能与以下事实有关:如果_rpm声明为整数,则Dart会将其读取为原始类型,而不是整数类的对象,因此,如果在上声明,则initState实际上并没有传递对象,但是是原始的。但我不明白为什么在build方法中声明时它为什么起作用

我觉得这无关紧要,但是如果有人需要,这里是更新的值的代码_rpm拜托,请不要过多地阅读这本书,因为我觉得它实际上是不相关的,可能会分散注意力和使人迷惑。

onPressed: () {
          if (_isPlaying) {
            setState(() {
              _isPlaying = false;
            });
            Provider.of<MicrophoneEngine>(context, listen: false)
                .stopRecording();
          } else {
            setState(() {
              _isPlaying = true;
            });
            Provider.of<MicrophoneEngine>(context, listen: false)
                .startRecording((rpmCall) {
              setState(() {
                _rpm = rpmCall;
              });
            });
          }
        },
优宝

保留小部件的引用是一个不好的做法(就像第一个示例中一样),实际上,您根本不需要该List。

每次使用时setState,您都会重建小部件并传递新值。在第一个示例中HomePage(rpm: _rpm),每次都从init传递,这就是为什么它不更新的原因。意思是,您不必HomePage使用更新后的值进行重建,而只是通过HomePageinitState传递了实例化,该实例化的初始_rpm值为0

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

常量声明时的宽度不匹配vhdl

来自分类Dev

SQL-使用WITH在INSERT INTO上声明变量

来自分类Dev

在Unix服务器上声明变量

来自分类Dev

PHP在声明时获取类变量的值

来自分类Dev

声明时可以使用变量吗?

来自分类Dev

声明时初始化变量的值

来自分类Dev

在 html5 上声明时是否可以动态“创建”css 类?

来自分类Dev

在超类上声明最终静态变量与在扩展类上声明有什么区别?

来自分类Dev

Lua局部函数不选择局部变量成员,除非在声明时分配

来自分类Dev

必须在表类型上声明标量变量@insertValues

来自分类Dev

处理在外部js文件上声明的变量和函数

来自分类Dev

必须在表类型上声明标量变量@insertValues

来自分类Dev

如何在plsql上声明dbms输出变量?

来自分类Dev

反应this.setState不更新数组状态变量

来自分类Dev

声明时初始化全局变量的值

来自分类Dev

是否应在声明时初始化Java变量?

来自分类Dev

Python声明变量与不声明

来自分类Dev

setState 不更新 DOM

来自分类Dev

VB不声明变量

来自分类Dev

反应setState不立即更新

来自分类常见问题

反应setState不更新状态

来自分类Dev

setState()不更新视图-reactjs

来自分类Dev

SetState不更新小部件

来自分类Dev

Flutter:setState不更新UI

来自分类Dev

setState 不更新状态对象

来自分类Dev

React - setState 不更新值

来自分类Dev

setState 不更新 wiget UI

来自分类Dev

在进行前向声明时,不命名参数和命名参数之间有区别吗?

来自分类Dev

段落的 CSS 样式在 head 中不生效,但在 body 中声明时生效