setState未更新值

时间:2019-02-13 08:35:11

标签: dart flutter

问题: setState不会保存 _products的值。

尝试过: 如果我在setState函数中打印 _products 的值,则会对其进行更新:

['Product 1', 'Product 2', 'New Product']

但是当我将 _products 传递给我的 Products 类时,会重置 _products 的值:

['Product 1', 'Product 2']

代码:

import 'package:flutter/material.dart';

import './products.dart';

class ProductManager extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _ProductManagerState();
  }
}

class _ProductManagerState extends State<ProductManager> {
  @override
  Widget build(BuildContext context) {

    List<String> _products = ['Product 1', 'Product 2'];
    return Column(
      children: [
        Container(
          margin: EdgeInsets.all(10.0),
          child: RaisedButton(
            onPressed: () {
              setState(() {
                _products.add('New Product');
              });
            },
            child: Text('Add Product'),
          ),
        ),
        Products(_products),
      ],
    );
  }
}

3 个答案:

答案 0 :(得分:5)

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.0/umd/react.production.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.0/umd/react-dom.production.min.js"></script> <div id='root'>函数之外初始化_products列表。

每次调用build时,都会调用setState()方法,该方法会重置build(),因为它是在方法内部初始化的。

尝试这样做:

_products

答案 1 :(得分:2)

编写Flutter应用程序时要牢记的一条黄金法则:

  

小部件是不可变的。

这意味着,在第一次构建窗口小部件内声明的任何内容(有状态或无状态)都不会更改。

状态对象(即 _ProductManagerState )是可变的,不会反映Widget中的任何更改(黄金规则一)。

仅当且仅当正在重建窗口小部件时才会反映更新(注意:重建窗口小部件= / =重建类!)。因此,在调用 setState 时,它不仅将产品添加到列表中,而且还强制进行了重建。这就是为什么首先需要 setState 的原因。

因此,正如其他人所建议的那样,将_products的初始化移出构建将解决其“不保存”的问题。

它确实可以保存,只是每次小部件重新构建自身时都会重新初始化。

答案 2 :(得分:0)

<class 'int'>
<class 'int'>
FF..
======================================================================
FAIL: test_foo_end (__main__.classTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "class_UT.py", line 51, in test_foo_end
    self.assertEqual(self, test_end, dummy_end)
AssertionError: <__main__.classTests 
testMethod=test_foo_end> != 4 : 4