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