ReorderableListView 在项目列表中有 Slider 时抛出
ReorderableListView throws when Slider in item list
我有一个 ReorderableListView,其中 ListTile 包含一个 Slider() 小部件。如果我不接触任何 Slider() 小部件,我可以毫无问题地重新排序 ListTiles。但是,一旦您单击或与任何 Slider() 小部件交互,然后尝试在调试控制台中使用此错误重新排序 throws() 项目(其中许多):
════════ Exception caught by scheduler library ═════════════════════════════════
Assertion failed:
../…/rendering/layer.dart:2498
leader._lastOffset != null
"LeaderLayer anchor must come before FollowerLayer in paint order, but the reverse was true."
在 Flutter 2.8.1 上,稳定频道。
这是要复制的代码。我使用了 ReorderableListView 小部件文档中的示例代码,我唯一更改的是将 Text() 更改为 Slider() 以及为 Slider() 自动生成一些值。除此之外,它与文档中的示例相同。这适用于 Text() 小部件,但 Slider() 失败。有没有办法在 ReorderableListView() 中使用 Slider()?:
import 'dart:math';
import 'package:flutter/material.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: const Scaffold(
body: Center(
child: ListViewTestWidget(),
),
),
);
}
}
class ListViewTestWidget extends StatefulWidget {
const ListViewTestWidget({Key? key}) : super(key: key);
@override
_ListViewTestWidgetState createState() => _ListViewTestWidgetState();
}
class _ListViewTestWidgetState extends State<ListViewTestWidget> {
final List<int> _items = List<int>.generate(50, (int index) => index);
final List<double> _values =
List<double>.generate(50, (int index) => Random().nextDouble() * 100);
_changeValue(int index, double newValue) {
if (newValue < 1 || newValue > 100) return;
setState(() {
_values[index] = newValue;
});
}
@override
Widget build(BuildContext context) {
final ColorScheme colorScheme = Theme.of(context).colorScheme;
final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
final Color evenItemColor = colorScheme.primary.withOpacity(0.15);
return ReorderableListView(
padding: const EdgeInsets.symmetric(horizontal: 40),
children: <Widget>[
for (int index = 0; index < _items.length; index += 1)
ListTile(
key: Key('$index'),
tileColor: _items[index].isOdd ? oddItemColor : evenItemColor,
title: Slider(
min: 1,
max: 100,
value: _values[index],
onChanged: (newValue) =>
setState(() => _changeValue(index, newValue)),
),
),
],
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final int item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
});
},
);
}
}
这是 flutter 框架本身的一个已知问题。您可以在 GitHub 上跟踪此问题的进展:https://github.com/flutter/flutter/issues/97292
同时(在他们修复它之前),您也许可以尝试使用 CupertinoSlider
来替换 (Material) Slider
。 Cupertino 小部件不会出现此问题。是的,它们看起来有点不同,但主要功能是相同的。或者您可以编写自己的滑块小部件并根据需要对其进行自定义。
我有一个 ReorderableListView,其中 ListTile 包含一个 Slider() 小部件。如果我不接触任何 Slider() 小部件,我可以毫无问题地重新排序 ListTiles。但是,一旦您单击或与任何 Slider() 小部件交互,然后尝试在调试控制台中使用此错误重新排序 throws() 项目(其中许多):
════════ Exception caught by scheduler library ═════════════════════════════════
Assertion failed:
../…/rendering/layer.dart:2498
leader._lastOffset != null
"LeaderLayer anchor must come before FollowerLayer in paint order, but the reverse was true."
在 Flutter 2.8.1 上,稳定频道。
这是要复制的代码。我使用了 ReorderableListView 小部件文档中的示例代码,我唯一更改的是将 Text() 更改为 Slider() 以及为 Slider() 自动生成一些值。除此之外,它与文档中的示例相同。这适用于 Text() 小部件,但 Slider() 失败。有没有办法在 ReorderableListView() 中使用 Slider()?:
import 'dart:math';
import 'package:flutter/material.dart';
const Color darkBlue = Color.fromARGB(255, 18, 32, 47);
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData.dark().copyWith(
scaffoldBackgroundColor: darkBlue,
),
debugShowCheckedModeBanner: false,
home: const Scaffold(
body: Center(
child: ListViewTestWidget(),
),
),
);
}
}
class ListViewTestWidget extends StatefulWidget {
const ListViewTestWidget({Key? key}) : super(key: key);
@override
_ListViewTestWidgetState createState() => _ListViewTestWidgetState();
}
class _ListViewTestWidgetState extends State<ListViewTestWidget> {
final List<int> _items = List<int>.generate(50, (int index) => index);
final List<double> _values =
List<double>.generate(50, (int index) => Random().nextDouble() * 100);
_changeValue(int index, double newValue) {
if (newValue < 1 || newValue > 100) return;
setState(() {
_values[index] = newValue;
});
}
@override
Widget build(BuildContext context) {
final ColorScheme colorScheme = Theme.of(context).colorScheme;
final Color oddItemColor = colorScheme.primary.withOpacity(0.05);
final Color evenItemColor = colorScheme.primary.withOpacity(0.15);
return ReorderableListView(
padding: const EdgeInsets.symmetric(horizontal: 40),
children: <Widget>[
for (int index = 0; index < _items.length; index += 1)
ListTile(
key: Key('$index'),
tileColor: _items[index].isOdd ? oddItemColor : evenItemColor,
title: Slider(
min: 1,
max: 100,
value: _values[index],
onChanged: (newValue) =>
setState(() => _changeValue(index, newValue)),
),
),
],
onReorder: (int oldIndex, int newIndex) {
setState(() {
if (oldIndex < newIndex) {
newIndex -= 1;
}
final int item = _items.removeAt(oldIndex);
_items.insert(newIndex, item);
});
},
);
}
}
这是 flutter 框架本身的一个已知问题。您可以在 GitHub 上跟踪此问题的进展:https://github.com/flutter/flutter/issues/97292
同时(在他们修复它之前),您也许可以尝试使用 CupertinoSlider
来替换 (Material) Slider
。 Cupertino 小部件不会出现此问题。是的,它们看起来有点不同,但主要功能是相同的。或者您可以编写自己的滑块小部件并根据需要对其进行自定义。