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 小部件不会出现此问题。是的,它们看起来有点不同,但主要功能是相同的。或者您可以编写自己的滑块小部件并根据需要对其进行自定义。