Как я могу дать приоритет жеста списка просмотра scrollabl ie над скользящей панелью в Flutter? - PullRequest
1 голос
/ 07 апреля 2020

У меня есть скользящая панель (Sliding_up_panel 1.0.0 - https://pub.dev/packages/sliding_up_panel# -example-tab- ), которая позволяет мне сдвигать панель вверх от нижней части экрана и, очевидно, обратно к скрытой штат. На этой панели я добавил прокручиваемый разделенный список. Само движение панели работает нормально, так как я могу показать и скрыть панель, как задумано. У меня проблема со списком. Когда я прокручиваю список вниз жестом вверх, список прекрасно прокручивается. Однако, когда я прокручиваю список вверх жестом вниз по вертикали, панель перемещается в скрытый вид вместе с прокруткой списка. Я хотел бы показать вам видео здесь, но у меня нет возможности, но вот пара скриншотов двух разных состояний.

Я использовал gestRecognizer в части GoogleMap моего приложения , но, конечно, ListView не имеет этого, так как я могу прокрутить список в обе стороны, не возвращая панель в скрытое состояние?

Скрытое состояние

enter image description here

Отображаемое состояние

enter image description here

Панель Код

Widget _floatingCollapsed(BuildContext context, _fontSize) {
    return Container(
      padding: EdgeInsets.all(0),
      decoration: BoxDecoration(
          color: Theme.UniColour.primary[900],
          borderRadius: BorderRadius.only(
              topLeft: Radius.circular(14.0), topRight: Radius.circular(14.0)),
          boxShadow: [
            BoxShadow(
              blurRadius: 7.0,
              color: Colors.black87,
            ),
          ]),
      margin: EdgeInsets.fromLTRB(28.0, 42.0, 28.0, 0.0),
      child: Center(
        child: Text(
          "Slide up to select a building",
          style: TextStyle(color: Colors.white, fontSize: _fontSize),
        ),
      ),
    );
  }

  Widget _floatingPanel(sc, _fontSize) {
    return Container(
      decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.all(
            Radius.circular(14.0),
          ),
          boxShadow: [
            BoxShadow(
              blurRadius: 7.0,
              color: Colors.black87,
            ),
          ]),
      margin: EdgeInsets.fromLTRB(28.0, 42.0, 28.0, 35.0),
      child: Center(
        child: Container(
          margin: EdgeInsets.fromLTRB(0.0, 0.0, 0.0, 0.0),
          child: Column(children: [
            //Expanded(
            ////  flex: 4,
                          ClipRRect(
                borderRadius: BorderRadius.circular(14.0),
                child: Image(
                  image:
                      AssetImage('assets/imgs/generic/BuildingsPanelHeader.jpg'),
                  width: MediaQuery.of(context).size.width,
                  fit: BoxFit.contain,
                ),
              ),
           // ),
            Expanded(
              flex: 1,
              child: _showBuildingList(_fontSize),
            ),
          ]),
        ),
      ),
    );
  }

Список зданий Код

_showBuildingList(_fontSize) {
  return LayoutBuilder(
      builder: (BuildContext context, BoxConstraints constraints) {
    return Container(
      //color: Colors.transparent,
      //width: MediaQuery.of(context).size.width * 0.85,
      //height: (MediaQuery.of(context).size.height * 0.85),
      padding: EdgeInsets.symmetric(horizontal: 20.0),
      child: FutureBuilder(
        future: getBuildingsfromXML(context),
        builder: (context, results) {
          if (results.hasData) {
            List<Building> buildings = results.data;
            return ListView.separated(
                shrinkWrap: true,
                physics: BouncingScrollPhysics(),
                separatorBuilder: (context, index) =>
                    Divider(color: Theme.UniColour.primary[700]),
                itemCount: buildings.length,
                itemBuilder: (context, index) {
                  return ListTile(
                    contentPadding: EdgeInsets.zero,
                    leading: Icon(Icons.business,
                        color: Theme.UniColour.primary[500]),
                    title: Text(
                      buildings[index].name,
                      style: TextStyle(
                          fontSize: _fontSize, fontWeight: FontWeight.normal),
                    ),
                  );
                });
          } else {
            return Center(
              child: CircularProgressIndicator(
                valueColor:
                    AlwaysStoppedAnimation(Theme.UniColour.secondary[900]),
                backgroundColor: Theme.UniColour.primary[900],
              ),
            );
          }
        },
      ),
    );
  });
}

Future<List<Building>> getBuildingsfromXML(BuildContext context) async {
  String xmlString = await DefaultAssetBundle.of(context)
      .loadString('assets/campus/buildings.kml');

  var raw = xml.parse(xmlString);
  var elements = raw.findAllElements("Placemark");

  return elements.map((element) {
    return Building(element.findElements("name").first.text);
  }).toList();
}

спасибо

...