Есть ли способ закрыть модальный нижний лист во flutter, содержащий listview?

#flutter #listview

#flutter #listview

Вопрос:

Итак, в основном я пытался в течение нескольких дней разрешить пользователям закрывать модальный нижний лист, когда они добираются до вершины ListView, проводя пальцем по ListView. Однако, когда они проводят пальцем по списку, виджеты регистрируются так, как будто я просто пытаюсь прокрутить вверх по ListView. Существует ли физический тип для ListView, чтобы закрыть модальный нижний лист, когда он находится вверху, или другой способ настроить указатель игнорирования для этого? Это то, что я придумал, и я надеюсь, что я объяснил себя достаточно хорошо, чтобы понять эту проблему.

 import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

class ModalSheet extends StatefulWidget {
  @override
  _ModalSheetState createState() => _ModalSheetState();
}

ScrollController _scrollController = ScrollController();
bool close = false;

class _ModalSheetState extends State<ModalSheet> {
  @override
  void initState() {
    super.initState();
    _scrollController.addListener(() {
      if (_scrollController.position.pixels < 1) {
        if (_scrollController.position.userScrollDirection ==
            ScrollDirection.forward) {
          setState(() {
            close = true;
          });
        } else {
          setState(() {
            close = false;
          });
        }
      } else {
        setState(() {
          close = false;
        });
      }
      print(_scrollController.position.pixels);
      print(_scrollController.position.userScrollDirection);
      print(close);
      // print(close);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: Column(
        children: [
          Flexible(
            child: IgnorePointer(
              ignoring: close,
              child: ListView.builder(
                controller: _scrollController,
                physics: BouncingScrollPhysics(),
                itemBuilder: (context, index) {
                  return ListTile(
                    title: Text('tile: ${index   1}'),
                  );
                },
              ),
            ),
          ),
        ],
      ),
    );
  }
}
  

РЕДАКТИРОВАТЬ: Спасибо @LearningJS888 за предложение пакета ниже, чтобы использовать этот пакет! с благодарностью

Ответ №1:

Можете ли вы уточнить, что именно вы пытаетесь сделать? Обычный способ закрытия ModalBottomSheet — by Navigator.pop(context) .

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

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

2. Ах, я понимаю, попробуйте этот пакет