Flutter 颤振:在列表中删除错误的索引。排序()降序
我有listviewBuilder,我想根据DateCreate用以下代码对我的listview进行排序Flutter 颤振:在列表中删除错误的索引。排序()降序,flutter,dart,Flutter,Dart,我有listviewBuilder,我想根据DateCreate用以下代码对我的listview进行排序 taskList.sort((a,b)=>-a.dateCreate.compareTo(b.dateCreate)) 一切正常,我可以看到我的列表排序(降序)基于DateCreate,但问题是每次我删除/更新列表时,操作都是错误的索引 它没有分类(工作) 正在使用排序(失败!!!) 如果在失败的gif中看到,我希望删除索引0,但索引1已删除。如果没有排序列表就可以了 我肯定通过了正确的
taskList.sort((a,b)=>-a.dateCreate.compareTo(b.dateCreate))代码>
一切正常,我可以看到我的列表排序(降序)基于DateCreate,但问题是每次我删除/更新列表时,操作都是错误的索引
它没有分类(工作)
正在使用排序(失败!!!)
如果在失败的gif中看到,我希望删除索引0,但索引1已删除。如果没有排序列表就可以了
我肯定通过了正确的索引,因为在工作gif中,我可以成功地删除正确的索引
我怎样才能解决这个问题
ListviewBuilder源代码:
按下的功能:
class CardOddCustom扩展StatefulWidget{
最终日期时间任务;
最后的字符串标题;
最终字符串图像路径;
最终日期时间日期创建;
最终整数码图标;
最终int索引任务;
卡多德海关({
这个任务,
这个题目,
这个.imagePath,
这个.dateCreate,
这个.codeIcon,
这是indexTask,
});
@凌驾
_CardOddCustomState createState()=>\u CardOddCustomState();
}
类_CardOddCustomState扩展状态{
返回InkResponse(
onLongPress:()=>
taskProvider.deleteCategory(indexBox:widget.indexTask),
孩子:卡片(
形状:圆形矩形边框(
borderRadius:仅限borderRadius(
右上角:半径。圆形(80),
右下角:半径。圆形(80),
),
),
任务列表
是Hive.box的副本
taskList = box.values.toList().cast<TaskModel>();
您不使用box.put
或box.putAll
来保存更改
当您执行hiveBox.deleteAt
时,它实际上与hiveBox中的序列一致
await hiveBox.deleteAt(indexBox);
当您放置/获取/删除时,可以使用键
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
class PersonAdapter extends TypeAdapter<Person> {
@override
final typeId = 1;
@override
Person read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Person()
..name = fields[0] as String
..age = fields[1] as int
..friends = (fields[2] as List)?.cast<String>();
}
@override
void write(BinaryWriter writer, Person obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.age)
..writeByte(2)
..write(obj.friends);
}
}
@HiveType(typeId: 1)
class Person {
@HiveField(0)
String name;
@HiveField(1)
int age;
@HiveField(2)
List<String> friends;
@override
String toString() {
return '$name: $age';
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
var dir = await getApplicationDocumentsDirectory();
Hive
..init(dir.path)
..registerAdapter(PersonAdapter());
var box = await Hive.openBox('testBox');
var person = Person()
..name = 'Dave'
..age = 22
..friends = ['Linda', 'Marc', 'Anne'];
var current = DateTime.now().toString();
await box.put(current, person);
print(box.get(current)); // Dave: 22
}
编辑
在官方示例中,当您放置
“dave”是put/get/delete的键
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
class PersonAdapter extends TypeAdapter<Person> {
@override
final typeId = 1;
@override
Person read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Person()
..name = fields[0] as String
..age = fields[1] as int
..friends = (fields[2] as List)?.cast<String>();
}
@override
void write(BinaryWriter writer, Person obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.age)
..writeByte(2)
..write(obj.friends);
}
}
@HiveType(typeId: 1)
class Person {
@HiveField(0)
String name;
@HiveField(1)
int age;
@HiveField(2)
List<String> friends;
@override
String toString() {
return '$name: $age';
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
var dir = await getApplicationDocumentsDirectory();
Hive
..init(dir.path)
..registerAdapter(PersonAdapter());
var box = await Hive.openBox('testBox');
var person = Person()
..name = 'Dave'
..age = 22
..friends = ['Linda', 'Marc', 'Anne'];
var current = DateTime.now().toString();
await box.put(current, person);
print(box.get(current)); // Dave: 22
}
导入“包装:颤振/材料.省道”;
导入“package:hive/hive.dart”;
导入“package:path_provider/path_provider.dart”;
类PersonalAdapter扩展了TypeAdapter{
@凌驾
最终类型ID=1;
@凌驾
人员读取(二进制读取器){
var numofields=reader.readByte();
变量字段={
对于(var i=0;i
共享删除的代码片段item@Vamsi请查看我的更新。wait-hiveBox.deleteAt()
仅接受int,但我的类型idTask是DateTime,不适合,但我尝试更改为wait-hiveBox.delete(idTask)
它不起作用。在官方示例中,当你输入时,键是相同的,你如何处理输入?你可以将它用作键,在示例“dave”中,你可以看到我编辑的答案。这很有意义,我使用wait hiveBox.add()
添加数据。///使用自动递增键保存[value]。未来添加(E值);源代码说添加使用自动递增键在您的情况下,我建议使用put(键,您的数据)并将此键传递给delete函数
taskList.sort((a, b) => -a.dateCreate.compareTo(b.dateCreate));
await hiveBox.deleteAt(indexBox);
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart';
class PersonAdapter extends TypeAdapter<Person> {
@override
final typeId = 1;
@override
Person read(BinaryReader reader) {
var numOfFields = reader.readByte();
var fields = <int, dynamic>{
for (var i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return Person()
..name = fields[0] as String
..age = fields[1] as int
..friends = (fields[2] as List)?.cast<String>();
}
@override
void write(BinaryWriter writer, Person obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.age)
..writeByte(2)
..write(obj.friends);
}
}
@HiveType(typeId: 1)
class Person {
@HiveField(0)
String name;
@HiveField(1)
int age;
@HiveField(2)
List<String> friends;
@override
String toString() {
return '$name: $age';
}
}
void main() async {
WidgetsFlutterBinding.ensureInitialized();
var dir = await getApplicationDocumentsDirectory();
Hive
..init(dir.path)
..registerAdapter(PersonAdapter());
var box = await Hive.openBox('testBox');
var person = Person()
..name = 'Dave'
..age = 22
..friends = ['Linda', 'Marc', 'Anne'];
var current = DateTime.now().toString();
await box.put(current, person);
print(box.get(current)); // Dave: 22
}