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