Переупорядочиваемый вид списка не работает при использовании в ящике

Мне нужно использовать переупорядочиваемый список в ящике. Для этого я создаю виджет. Когда я использую виджет на главном экране / эшафоте / сборке: все в порядке.

Но когда я использую тот же виджет в ящике, я получаю исключение приложения, предлагающее заполнить отчет об ошибке.

Нужно ли мне что-то делать при использовании виджета в ящике или это действительно ошибка?

Упрощенная версия моей программы:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: _myDrawer(),
      drawer: Container(child: _myDrawer()),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

class _myDrawer extends StatefulWidget {
  _myDrawer({
    Key key,
  }) : super(key: key);

  @override
  __myDrawerState createState() => __myDrawerState();
}

class __myDrawerState extends State<_myDrawer> {
  List<String> _sortList = ['Cat1', 'Cat2', 'Date'];

  @override
  Widget build(BuildContext context) {
    return Container(
      child: ReorderableListView(onReorder: (int oldIndex, int newIndex) {},
          //scrollDirection: Axis.vertical,
          //padding: const EdgeInsets.symmetric(vertical: 8.0),
          children: <Widget>[
            Card(
              key: ValueKey(_sortList[0]),
              child: ListTile(
                title: Text(_sortList[0]),
              ),
            ),
            Card(
              key: ValueKey(_sortList[1]),
              child: ListTile(
                title: Text(_sortList[1]),
              ),
            ),
            Card(
              key: ValueKey(_sortList[2]),
              child: ListTile(
                title: Text(_sortList[2]),
              ),
            ),
          ]),
    );
  }
}

Отчет о сбое следующий:

════════ Exception caught by gesture ═══════════════════════════════════════════════════════════════
The following assertion was thrown while handling a gesture:
ScrollController attached to multiple scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 111 pos 12: '_positions.length == 1'


Either the assertion indicates an error in the framework itself, or we should provide substantially more information in this error message to help you determine and fix the underlying cause.
In either case, please report this assertion by filing a bug on GitHub:
  https://github.com/flutter/flutter/issues/new?template=BUG.md

When the exception was thrown, this was the stack: 
#2      ScrollController.position (package:flutter/src/widgets/scroll_controller.dart:111:12)
#3      ScrollController.offset (package:flutter/src/widgets/scroll_controller.dart:118:24)
#4      _ReorderableListContentState._scrollTo (package:flutter/src/material/reorderable_list.dart:322:51)
#5      _ReorderableListContentState._wrap.<anonymous closure>.<anonymous closure> (package:flutter/src/material/reorderable_list.dart:543:11)
#6      _DragTargetState.didEnter (package:flutter/src/widgets/drag_target.dart:522:88)
...
Handler: "onStart"
Recognizer: DelayedMultiDragGestureRecognizer#1c0a1
════════════════════════════════════════════════════════════════════════════════════════════════════

Спасибо за вашу помощь!

1 ответ

Я не могу воспроизвести упомянутую вами проблему. Я правильно вижу ящик, когда нажимаю на него:

Вот полный код:

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      //   body: _myDrawer(),
      drawer: Container(child: _MyDrawer())
    );
  }
}

class _MyDrawer extends StatefulWidget {
  _MyDrawer({
    Key key,
  }) : super(key: key);

  @override
  __MyDrawerState createState() => __MyDrawerState();
}

class __MyDrawerState extends State<_MyDrawer> {
  List<String> _sortList = ['Cat1', 'Cat2', 'Date'];

  @override
  Widget build(BuildContext context) {
    return Container(
      child: ReorderableListView(onReorder: (int oldIndex, int newIndex) {},
          scrollDirection: Axis.vertical,
          padding: const EdgeInsets.symmetric(vertical: 8.0),
          children: <Widget>[
            Card(
              key: ValueKey(_sortList[0]),
              child: ListTile(
                title: Text(_sortList[0]),
              ),
            ),
            Card(
              key: ValueKey(_sortList[1]),
              child: ListTile(
                title: Text(_sortList[1]),
              ),
            ),
            Card(
              key: ValueKey(_sortList[2]),
              child: ListTile(
                title: Text(_sortList[2]),
              ),
            ),
          ]),
    );
  }
}

Примечание: у меня последняя стабильная версия Flutter.

Другие вопросы по тегам