Один контроллер для двух просмотров прокрутки

#dart #flutter

#dart #флаттер

Вопрос:

У меня есть два просмотра прокрутки. Один вложенный, у которого есть панель SliverAppBar, а затем один CHILDSCROLLVIEW для остального моего содержимого (как показано в коде ниже). Затем у меня есть контроллер, который управляет непрозрачностью моих плавающих кнопок действий при прокрутке вверх и вниз.

Однако контроллер работает, только если он у меня есть в NestedScroll, и тогда он работает только при прокрутке фактического заголовка, а не при прокрутке остального содержимого.

Если я добавлю один и тот же контроллер в SingleChildScrollView, это заставит два вида прокручиваться отдельно. Есть идеи по исправлению?

 Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
    resizeToAvoidBottomPadding: false,
    body: NestedScrollView(
    controller: _controller,
              headerSliverBuilder: (BuildContext context, bool innerBoxScrolled){
                  return <Widget>[
                    SliverAppBar(
              },
              body:SingleChildScrollView(
            ),
  

Я сократил код, чтобы показывать только два вида.

Это метод, с помощью которого я изменяю непрозрачность базы данных:

  void _scrollListener() {
if(_controller.position.userScrollDirection == ScrollDirection.reverse){
  setState(() {
    _hideFAB = true;
  });
}

if(_controller.position.userScrollDirection == ScrollDirection.forward){
  setState((){
    _hideFAB = false;
  });
}
  

}

Вот GIF, показывающий, что FAB изменяется только при прокрутке в панели приложений Sliver: GIPHY

Ответ №1:

Используйте ListView вместо SingleChildScrollView , поместите остальное содержимое в ListView

     Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
    resizeToAvoidBottomPadding: false,
    body: NestedScrollView(
    controller: _controller,
              headerSliverBuilder: (BuildContext context, bool innerBoxScrolled){
                  return <Widget>[
                    SliverAppBar(
              },
              body:ListView(
            ),
  

Комментарии:

1. Попытался перейти на ListView, однако это не имело никакого значения. По-прежнему нет изменений в непрозрачности базы данных при прокрутке дальше, чем панель SliverAppBar.

2. Я бы предположил, что мне нужно добавить еще один контроллер или что-то в ListView, однако, если я попытаюсь это сделать, мне придется прокручивать SliverHeader и Listview отдельно

3. Исправлено с помощью Sliverlist вместо этого. Но спасибо за ответ.

Ответ №2:

Я исправил свою проблему, используя CustomScrollView вместо NestedScrollView , а затем заменил свой SingleChildScrollView на SliverList .