ScrollController.jumpTo () "ScrollController не привязан ни к одному виду прокрутки" - PullRequest
0 голосов
/ 12 сентября 2018

Я слушаю PageController, чтобы получить позицию, а затем синхронизирую ее с ListView.Когда PageView манипулирует, ListView манипулирует одновременно.

Пример: https://github.com/Ramotion/cardslider-android

Однако после v0.6.0 я получаю сообщение об ошибке, утверждающее, что мой ScrollController не привязан ни к каким представлениям.Это срабатывает каждый раз, когда происходит потоковое событие, запускающее метод .jumpTo().Это все еще работает, но ошибка утверждения сводит меня с ума.

[VERBOSE-2:shell.cc(181)] Dart Error: Unhandled exception:
'package:flutter/src/widgets/scroll_controller.dart': Failed assertion: line 169 pos 12: '_positions.isNotEmpty': ScrollController not attached to any scroll views.
#0      _AssertionError._doThrowNew (dart:core/runtime/liberrors_patch.dart:40:39)
#1      _AssertionError._throwNew (dart:core/runtime/liberrors_patch.dart:36:5)
#2      ScrollController.jumpTo (package:flutter/src/widgets/scroll_controller.dart:169:12)
#3      MyTitle.build.<anonymous closure> (file:///Users/lukepighetti/code/when-coin/when_coin_2/lib/screens/rate/widgets/title.dart:19:19)
#4      _RootZone.runUnaryGuarded (dart:async/zone.dart:1314:10)
#5      _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:336:11)
#6      _DelayedData.perform (dart:async/stream_impl.dart:584:14)
#7      _StreamImplEvents.handleNext (dart:async/stream_impl.dart:700:11)
#8      _PendingEvents.schedule.<anonymous closure> (dart:async/stream_impl.dart:660:7)
#9      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#10     _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)

Как использовать ScrollController.jumpTo(), не сталкиваясь с этим исключением?

class MyTitle extends StatelessWidget {
  final List<Category> categories;
  MyTitle({this.categories});

  @override
  Widget build(BuildContext context) {
    final _controller = ScrollController();
    double height = 36.0;
    // double width = MediaQuery.of(context).size.width * 0.8;

    BlocProvider.of(context).page.listen((page) {
      _controller.jumpTo(height * page);
    });

    return Container(
      height: height,
      // width: width,
      child: ListView(
        controller: _controller,
        scrollDirection: Axis.vertical,
        physics: NeverScrollableScrollPhysics(),
        children: categories
            .map((c) => _Title(
                  title: c.title,
                  index: categories.indexOf(c),
                ))
            .toList(),
      ),
    );
  }
}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Как указано в ответе выше, вы используете ScrollController, когда он еще не присоединен к ListView или другому ScrollView.Вы можете проверить это с помощью атрибута hasClients.

if (_scrollController.hasClients) {
  await _scrollController.animateTo(
    0.0,
    curve: Curves.easeOut,
    duration: const Duration(milliseconds: 300),
  );
}
0 голосов
/ 12 сентября 2018

Вы пытаетесь прыгнуть, используя scrollController, прежде чем добавить scrollController к ScrollView (представление списка). Надо прыгать после добавления в контроллер. См. Код ниже.

 // task1
 Future.delayed(Duration.zero, () => 
 { // task2
  BlocProvider.of(context).page.listen((page) { _controller.jumpTo(height * page); }); 
 });
// task3

Это очень похоже на DispatchQueue.main.async, поскольку длительность равна ноль . Порядок выполнения будет задача 1, задача 3, задача 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...