Flutter中ReorderableListView无法重新排序问题求助
解决ReorderableListView拖动后弹回原位置的问题
你的问题核心是修改了build方法内的临时列表,而非真正的数据源。每次调用setState后,build会重新执行,List.from(ingredients)又会创建一个和原数据一致的新列表,导致排序操作被重置。
修复步骤:
- 直接操作类成员变量
ingredients(假设它是State类的状态变量),而不是在build里创建临时副本。 - 排序完成后,必须更新SQLite数据库中的顺序字段(比如新增一个
sort_order列),确保下次查询时能获取到正确的排序结果。
修改后的代码示例:
@override Widget build(BuildContext context) { return Scaffold( body: SafeArea( child: ReorderableListView( onReorder: (int oldIndex, int newIndex) { setState(() { // 调整newIndex(官方推荐的处理逻辑) if (newIndex > oldIndex) { newIndex -= 1; } // 直接操作原数据源ingredients final ingredient = ingredients.removeAt(oldIndex); ingredients.insert(newIndex, ingredient); // 调用方法更新SQLite中的排序顺序 _updateIngredientOrder(); }); }, children: ingredients.asMap().entries.map((entry) { final index = entry.key; final ingredient = entry.value; return ReorderableDragStartListener( index: index, key: Key(ingredient["ID"].toString()), child: ListTile( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => IngredientDetailPage(widget.db, ingredient["ID"]), ), ); }, title: Text(ingredient["Name"]), ), ); }).toList(), ), ), ); } // 新增方法:更新SQLite中的排序字段 Future<void> _updateIngredientOrder() async { for (int i = 0; i < ingredients.length; i++) { await widget.db.update( 'ingredients', // 你的表名 {'sort_order': i}, // 假设你有一个sort_order列存储顺序 where: 'ID = ?', whereArgs: [ingredients[i]["ID"]], ); } }
关键说明:
- 移除临时列表:不再在build里创建
ingredientsOrderable,直接使用ingredients状态变量,这样修改后setState会刷新正确的排序结果。 - 持久化排序:必须更新SQLite,否则下次从数据库查询时,数据会回到初始排序状态。需要确保你的表中有一个用于存储排序顺序的字段(比如
sort_order),查询时也要按照这个字段排序:
// 查询数据时按sort_order排序 ingredients = await widget.db.query( 'ingredients', orderBy: 'sort_order ASC', );
内容的提问来源于stack exchange,提问作者Jose Mulia
相关产品推荐
相关产品推荐

