Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart setState未更新值_Dart_Flutter - Fatal编程技术网

Dart setState未更新值

Dart setState未更新值,dart,flutter,Dart,Flutter,问题: setState未保存_产品的价值 尝试: 如果我在setState函数中打印_products的值,它将被更新: ['Product 1', 'Product 2', 'New Product'] 但当我将_products传递到我的products类时,_products的值被重置: ['Product 1', 'Product 2'] 代码: 在构建函数外部初始化_产品列表 每次调用setState时,都会调用build方法,该方法会重置_产品,因为它是在方法内部初始化的 尝试

问题: setState未保存_产品的价值

尝试: 如果我在setState函数中打印_products的值,它将被更新:

['Product 1', 'Product 2', 'New Product']
但当我将_products传递到我的products类时,_products的值被重置:

['Product 1', 'Product 2']
代码:

在构建函数外部初始化_产品列表

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

尝试这样做:

class _ProductManagerState extends State<ProductManager> {

  List<String> _products = ['Product 1', 'Product 2'];

  @override
  Widget build(BuildContext context) {
   /*Rest of the code*/
  }
}

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

小部件是不可变的

这意味着,小部件中声明的任何有状态或无状态在第一次构建后都不会改变

状态对象,即_ProductManagerState,虽然是可变的,但不会反映小部件黄金法则1中的任何更改

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

因此,正如其他人所建议的,将_产品的初始化移出构建将解决它不保存的问题

它确实保存了,只是每次小部件重新构建自己时它都得到了重新初始化

class _ProductManagerState extends State<ProductManager> {

  List<String> _products = ['Product 1', 'Product 2'];

  @override
  Widget build(BuildContext context) {
   /*Rest of the code*/
  }
}
import 'package:flutter/material.dart';

import './products.dart';

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

class _ProductManagerState extends State<ProductManager> {

  List<String> _products = ['Product 1', 'Product 2'];
  @override
  Widget build(BuildContext context) {

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