【问题标题】:Flutter, checkbox state doesn't change, how to?颤振,复选框状态没有改变,怎么办?
【发布时间】:2018-04-22 22:11:38
【问题描述】:

我有一个 ListView 构建器,它创建了几个 ListTitle,其中包含一个复选框。

当我在复选框上的onChangedsetState 时,值似乎没有改变。

class ProjectPage extends StatefulWidget {
  final project;

  ProjectPage({Key key, this.project}) : super(key: key);

  @override
  _ProjectPageState createState() => new _ProjectPageState();
}

class _ProjectPageState extends State<ProjectPage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Container(
        child: Column(
          children: <Widget>[
            new Expanded(
              child: new ListView.builder(
                itemBuilder: (BuildContext context, int index) => new ItemsItem(item: widget.project.items[index]),
                itemCount: widget.project.items.length,
              ),
            ),
          ],
        ),
      ),
    );
  }
}

class ItemsItem extends StatefulWidget {
  final item;

  ItemsItem({Key key, this.item}) : super(key: key);

  @override
  _ItemsItemState createState() => new _ItemsItemState();
}

class _ItemsItemState extends State<ItemsItem> {
  final GlobalKey<ScaffoldState> _mainState = new GlobalKey<ScaffoldState>();

  @override
  Widget build(BuildContext context) {
    bool _isCompleted = widget.item.isCompleted;

    return new ListTile(
      key: _mainState,
      title: new Row(
        children: <Widget>[
          new Expanded(child: new Text(widget.item.name)),
          new Checkbox(
            value: _isCompleted,
            onChanged: (bool newValue) {
              setState(() {
                _isCompleted = newValue;
              });
            },
          ),
        ],
      ),
    );
  }
}

这似乎并没有改变价值

setState(() {
    _isCompleted = newValue;
});

有什么想法吗?

编辑:物品类

class Item {
  final int id;
  final String name;
  final bool isCompleted;

  Item({
    this.id,
    this.name,
    this.isCompleted,
  });

  Item.fromJson(Map json)
      : id = json['id'],
        name = json['name'],
        isCompleted = json['isCompleted'],

  set isCompleted(bool value) {
    isCompleted = value;
  }
}

【问题讨论】:

    标签: flutter setstate


    【解决方案1】:

    _isCompleted 是 build 方法中的一个局部变量。当复选框的状态发生变化时,您将局部变量设置为新值。 setState 导致再次调用 build 方法,该方法从 widget.item.isCompleted 中获取旧的和未更改的值。您需要将 widget.item.isCompleted 设置为新的更改值:

    setState(() {
        widget.item.isCompleted = newValue;
    });
    

    顺便说一句,因为您的 ItemsItem 只是一个 ListTile,其中包含一行文本和一个复选框,您应该使用内置小部件 CheckboxListTile

    【讨论】:

    • 不会工作.. 在Item 类中我有一个设置器set isCompleted(bool value) { isCompleted = value; } 但我得到了这个Stack Overflow: The following StackOverflowError was thrown while handling a gesture: 错误
    • 我添加了Item类供参考
    • @Patrioticcow 问题是在您的 Item 类中 isCompleted 是最终的,但您正在尝试使用 isCompleted 设置器进行设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2021-05-30
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多