问题: 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),
],
);
}
}
答案 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