在listview multiselect中设置状态后,颤振布尔值会重置

时间:2020-10-01 06:43:15

标签: flutter listview flutter-listview

我的listview的复选框充满数据,当我选择选项时,它将选中该项目。 Listview是多重选择选项。有用于将jsonresponse转换为数据的模型类。 UI代码可以正常工作,但是执行不当会导致应用程序中的错误。 选中水龙头项目时,选中该复选框并自发重置。问题是要选中自动重置的所有项目上的复选框。模型类看起来好像有问题。在模拟器以及物理设备上面临的问题。 感谢您的时间。

这是我的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(),
                );
              }
            },
          ),
        ),
      ),
    );
  }
}

2 个答案:

答案 0 :(得分:0)

我猜setstate正在产生问题。它正在重新加载将来的构建器。 因此,您的选择正在重置

答案 1 :(得分:-1)

我不确定这是否行得通,但是也许您可以尝试将其切换

f <- function() {
  rstudioapi::sendToConsole("1")
  menu(c("yes", "no"))
}
f()
#> 1: yes
#> 2: no
#> 
#> Selection: 1
#> [1] 1

对此


snapshot.data[index].isSelected = value;

相关问题