У меня есть ListView, в верхней части которого у меня есть карта, я хочу, чтобы карта прокручивалась вне поля зрения при прокрутке ListView, но я также хочу, чтобы пользователь мог взаимодействовать с картой. Таким образом, прокрутка должна происходить только тогда, когда пользователь прокручивает другие виджеты ListView, а не когда они прокручивают карту, тогда я хочу, чтобы жест применялся непосредственно к карте. Однако в настоящее время, когда пользователь прокручивает карту, он прокручивает весь ListView.
Я пробовал другое предложение, с которым я столкнулся здесь
Как во Flutter дочерний виджет может предотвратить прокрутку своего родителя с возможностью прокрутки?
Я добавил GestureDetector
, как было предложено в ответе на пост выше, обернув контейнер карты в примере ниже, однако это просто заблокировало прокрутку как ListView, так и карты при прокрутке на карте. Ссылка на видео https://imgur.com/SeCRzUC
Вот виджет, возвращаемый моим методом сборки. Этот код зависит от плагина google_maps_flutter
.
Container(
height: MediaQuery.of(context).size.height,
child:
ListView.builder(
itemCount: 12 + 1,
itemBuilder: (context, index) {
if (index == 0) return GestureDetector(
onVerticalDragUpdate: (_){},
child: Container(
height: MediaQuery.of(context).size.height / 2,
child: GoogleMap(initialCameraPosition: initalPosition),
),
);
else return ListTile(title: Text("$index"),);
}
)
),
Я надеялся, что карта будет фиксировать жесты, но это не так, список, содержащий ее, фиксирует все. Может ли кто-нибудь предложить, как я могу заставить все жесты для этого элемента в списке передаваться непосредственно на карту и при этом прокручивать список, когда прокручиваются другие элементы в списке?
Обновлено: ответ Камповски внизу является обновленным ответом.
Depreciated Answer:
Оберните все с помощью ListView, если вы хотите убрать виджет GoogleMap с экрана при прокрутке.
Переопределите физику прокрутки ListView с помощью GoogleMap GesRecognizers.
Отключить физику прокрутки ListView.builder из-за конфликта между физикой ListView.
Сначала импортируйте зависимости:
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
метод сборки:
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
SizedBox(
height: MediaQuery.of(context).size.height / 2,
child: GoogleMap(
initialCameraPosition:
CameraPosition(target: LatLng(41, 29), zoom: 10),
gestureRecognizers: Set()
..add(
Factory<PanGestureRecognizer>(() => PanGestureRecognizer()))
..add(
Factory<VerticalDragGestureRecognizer>(
() => VerticalDragGestureRecognizer()),
)
..add(
Factory<HorizontalDragGestureRecognizer>(
() => HorizontalDragGestureRecognizer()),
)
..add(
Factory<ScaleGestureRecognizer>(
() => ScaleGestureRecognizer()),
),
),
),
ListView.builder(
physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: 12,
itemBuilder: (context, index) {
return ListTile(
title: Text("$index"),
);
},
)
],
),
);
}
@diarmuid это именно то, что тебе нужно, попробуй :)
Принятый ответ (ответ Эсет Мехмет был помечен как исключенный на момент написания) слишком сложен, и в моем случае он даже не сработал! Он обеспечивал прокрутку слева направо, панорамирование и масштабирование, однако прокрутка сверху вниз по-прежнему прокручивала ListView
.
Реальное решение очень простое, так как GoogleMap
по умолчанию имеет эти детекторы жестов. Вы должны просто указать, что обнаружение жестов должно иметь приоритет GoogleMap
, а не ListView
. Это достигается путем предоставления GoogleMap
объекту EagerGestureRecognizer
, например, следующим образом.
ListView(
children: <Widget>[
Text('a'),
Text('b'),
GoogleMap(
...,
gestureRecognizers: {
Factory<OneSequenceGestureRecognizer>(
() => EagerGestureRecognizer(),
),
},
),
],
)
Таким образом, все жесты, которые выполняются на объекте GoogleMap
или над ним, будут иметь приоритет для GoogleMap
, а не для любого другого виджета.
Спасибо @campovski, это 5-строчное решение отлично работает для меня. Я могу прокручивать ListView, а затем я могу прокручивать карту, когда касаюсь карты.
@eluong Рад, что это помогло, для меня это был кошмар, поэтому я решил поделиться своим решением.
@campovski Спасибо! Это то, что я искал
Нет необходимости в EagerGestureRecognizer, попробуйте это решение stackoverflow.com/questions/54280541/… С этим решением вы по-прежнему можете использовать просмотр страниц. Распознаватель Eager не разрешает прокрутку просмотра страниц
Спасибо за ответ! Правильно ли я говорю, что теперь ListView вообще не будет прокручиваться? Извините, перечитав свой первоначальный пост, я понимаю, что не дал понять, что я все еще хочу, чтобы ListView прокручивался, если пользователь прокручивает любую другую часть списка (кроме карты)