Google maps 在颤振中,如何使滚动列表视图手势优先于滑动面板?

Google maps 在颤振中,如何使滚动列表视图手势优先于滑动面板?,google-maps,listview,flutter,dart,gesture,Google Maps,Listview,Flutter,Dart,Gesture,我有一个滑动面板(向上滑动面板1.0.0-),它允许我从屏幕底部向上滑动面板,然后明显地向下滑动到它的隐藏状态。在这个面板中,我添加了一个可滚动的分隔列表视图。面板移动本身工作正常,因为我可以按预期显示和隐藏面板。我的问题是名单。当我用垂直向上的手势向下滚动列表时,列表会完美地滚动。但是,当我用垂直向下的手势向上滚动列表时,面板将随着列表滚动移动到其隐藏视图。我很想在这里给你们看一段视频,但我没有这个能力,但这里有两个不同州的截图 我已经在我的应用程序的GoogleMap部分使用了Gesture

我有一个滑动面板(向上滑动面板1.0.0-),它允许我从屏幕底部向上滑动面板,然后明显地向下滑动到它的隐藏状态。在这个面板中,我添加了一个可滚动的分隔列表视图。面板移动本身工作正常,因为我可以按预期显示和隐藏面板。我的问题是名单。当我用垂直向上的手势向下滚动列表时,列表会完美地滚动。但是,当我用垂直向下的手势向上滚动列表时,面板将随着列表滚动移动到其隐藏视图。我很想在这里给你们看一段视频,但我没有这个能力,但这里有两个不同州的截图

我已经在我的应用程序的GoogleMap部分使用了GestureRecognitor,但是,当然,ListView没有这个功能,所以我怎样才能在不让面板返回隐藏状态的情况下双向滚动列表呢

隐藏状态

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();
}

显示状态

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();
}

面板代码

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();
}
建筑清单代码

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();
}
\u显示构建列表(\u fontSize){
返回布局生成器(
生成器:(BuildContext上下文,BoxConstraints){
返回容器(
//颜色:颜色。透明,
//宽度:MediaQuery.of(context).size.width*0.85,
//高度:(MediaQuery.of(context.size.height*0.85),
填充:边缘组。对称(水平:20.0),
孩子:未来建设者(
未来:getBuildingsfromXML(上下文),
生成器:(上下文、结果){
if(results.hasData){
列出建筑物=结果。数据;
返回ListView.separated(
收缩膜:对,
物理:弹跳CrollPhysics(),
separatorBuilder:(上下文,索引)=>
分隔器(颜色:主题。单色。主[700]),
itemCount:buildings.length,
itemBuilder:(上下文,索引){
返回列表块(
contentPadding:EdgeInsets.zero,
领先:图标(Icons.business,
颜色:Theme.Unicolor.primary[500],
标题:正文(
建筑物[索引]。名称,
样式:TextStyle(
fontSize:_fontSize,fontWeight:fontWeight.normal),
),
);
});
}否则{
返回中心(
子对象:循环压缩机指示器(
valueColor:
AlwaysToppedAnimation(主题.单色.二级[900]),
背景色:Theme.Unicolor.primary[900],
),
);
}
},
),
);
});
}
未来的GetBuildingFromXML(BuildContext上下文)异步{
String xmlString=await DefaultAssetBundle.of(上下文)
.loadString('assets/campus/buildings.kml');
var raw=xml.parse(xmlString);
var元素=原始findAllElements(“Placemark”);
返回elements.map((element){
返回建筑物(element.findElements(“name”).first.text);
}).toList();
}
谢谢