在列表视图多选中设置状态后,颤振布尔值重置

Posted

技术标签:

【中文标题】在列表视图多选中设置状态后,颤振布尔值重置【英文标题】:Flutter bool value resets after setstate in listview multiselect 【发布时间】:2021-01-16 21:00:51 【问题描述】:

我有一个带有复选框的列表视图,其中填充了数据,当我选择选项时,它将选中该项目。 Listview 意味着是多选选项。有用于将 jsonresponse 转换为数据的模型类。 UI 代码工作正常,但 ontap 操作导致应用程序出现错误。 当点击项目被选中时,它会选中该框并自发重置。问题是关于选择它自动重置的所有项目上的复选框。模型类看起来有问题。在模拟器和物理设备上面临问题。 感谢您的时间。

这是我的 CommonResponse 类

class CommonResponse 
  final String id;
  final String name;
  bool isSelected = false;

  CommonResponse(this.id, this.name);

  factory CommonResponse.fromJson(Map<String, dynamic> json) 
    return CommonResponse(
      id: json['id'],
      name: json['name'] as String,
    );
  

这是用户界面代码:

import 'dart:convert';

import 'package:flutter/material.dart';

class WorkList extends StatefulWidget 
  Key key;

  WorkList(this.key) : super(key: key);

  @override
  _WorkListState createState() => _WorkListState();


class _WorkListState extends State<WorkList> 
  Constants constants = Constants();
  List<String> selectedPrefIdList = List();

  Future<List<CommonResponse>> _getList() async 
    var jsonData =
        '["id": "1", "name": "1-2 day", "id": "2", "name": "cameo", "id": "5", "name": "movies", "id": "6", "name": "ads"]';

    List jsonResponse = json.decode(jsonData);
    var workPrefOutput =
        jsonResponse.map((list) => CommonResponse.fromJson(list)).toList();
    return workPrefOutput;
  

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      body: SafeArea(
        child: Container(
          child: FutureBuilder<List<CommonResponse>>(
            future: _getList(),
            builder: (context, snapshot) 
              if (snapshot.hasData) 
                return ListView.separated(
                    separatorBuilder: (context, index) 
                      return Divider();
                    ,
                    itemCount: snapshot.data.length,
                    itemBuilder: (context, index) 
                      return CheckboxListTile(
                        title: Text(snapshot.data[index].name),
                        controlAffinity: ListTileControlAffinity.platform,
                        value: snapshot.data[index].isSelected,
                        onChanged: (value) 
                          setState(() 
                            snapshot.data[index].isSelected = value;
                            var selectedId = snapshot.data[index].id;
                            selectedPrefIdList.contains(selectedId)
                                ? selectedPrefIdList.remove(selectedId)
                                : selectedPrefIdList.add(selectedId);
                            // print(selectedPrefIdList);
                          );
                        ,
                      );
                    );
               else 
                return Center(
                  child: CircularProgressIndicator(),
                );
              
            ,
          ),
        ),
      ),
    );
  

【问题讨论】:

我没有完全理解你的问题。在您的模型类中,还存储所有列表的布尔值。让 bool 值默认为 false,您可以在选中该特定复选框后将其设置为 true。 【参考方案1】:

我不确定这是否可行,但也许你可以尝试切换它


snapshot.data[index].isSelected = value;

到这里

snapshot.data[index].isSelected = !snapshot.data[index].isSelected;

【讨论】:

【参考方案2】:

我猜 setstate 正在制造一个问题。它正在重新加载未来的构建器。 因此,您的选择正在重置

【讨论】:

那么现在该怎么办? 使用 bloc/provider 代替 FutureBuilder 来获取新数据。或者,使用 ValueNotifier 更新屏幕而不是未来的构建器

以上是关于在列表视图多选中设置状态后,颤振布尔值重置的主要内容,如果未能解决你的问题,请参考以下文章

发生异常。不良状态:Future 已经在颤振列表视图和视频播放器中完成

方向/配置更改后如何维护 ListView 片段状态?

多选模式列表视图行在删除后保持选中状态

颤振状态不会更新

快速,旋转图像视图并将旋转的图像视图设置为 uibutton

数据更新后颤振列表视图不更新