GoogleMap в PageView

#flutter

#flutter

Вопрос:

У меня есть googlemap, расположенная в контейнерах в pageview… Когда вы проводите пальцем между страницами, содержащими эти виджеты googlemap, копирование страниц прерывается… итак, внутри моего кода, когда я делаю

 class Homepage extends StatelessWidget {
  @override build(BuildContext context){
    return PageView(
      children: <Widget>[
        Container(color:Colors.red),
        Container(color:Colors.green),
        Container(color:Colors.blue),
        Container(color:Colors.yellow),
        Container(color:Colors.pink),
        // Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        // Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        // Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        // Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),))
      ],
    );
  }
  

Это работает нормально, и все страницы отлично привязываются.. Однако, когда я раскомментирую виджеты GoogleMap следующим образом:

 class Homepage extends StatelessWidget {
  @override build(BuildContext context){
    return PageView(
      children: <Widget>[
        // Container(color:Colors.red),
        // Container(color:Colors.green),
        // Container(color:Colors.blue),
        // Container(color:Colors.yellow),
        // Container(color:Colors.pink),
        Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)),
        Container(child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),))
      ],
    );
  }
}
  

Просмотр страницы работает некоторое время, но прерывается (на IOS), и эта ошибка (иногда) отображается в консоли:

 [VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: 'package:flutter/src/gestures/converter.dart': Failed assertion: line 155 pos 18: '!state.down': is not true.
#0      _AssertionError._doThrowNew (dart:core/runtime/liberrors_patch.dart:40:39)
#1      _AssertionError._throwNew (dart:core/runtime/liberrors_patch.dart:36:5)
#2      PointerEventConverter.expand (package:flutter/src/gestures/converter.dart:155:18)
#3      _SyncIterator.moveNext (dart:core/runtime/libcore_patch.dart:152:12)
#4      ListQueue.addAll (dart:collection/queue.dart:715:25)
#5      _WidgetsFlutterBindingamp;BindingBaseamp;GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:83:27)
#6      _rootRunUnary (dart:async/zone.dart:1136:13)
#7      _CustomZone.runUnary (dart:async/zone.dart:1029:19)
#8      _CustomZone.runUnaryGuarded (dart:async/zone.dart:931:7)
#9      _invoke1 (dart:ui/hooks.dart:223:10)
#10     _dispatchPointerDataPacket (dart:ui/hooks.dart:144:5
  

Кто-нибудь видел и исправил это?

Спасибо за ваше внимание..

Джон.

Комментарии:

1. Вы решили это? Меня интересует.

2. странно, я не могу воспроизвести эту ошибку в своей версии flutter.

3. вы должны обернуть свой виджет GoogleMap в контейнер, а затем добавить этот контейнер в контейнер просмотра страницы. Родительский контейнер предназначен для определения жестов.

4. Вы удаляете при навигации?

Ответ №1:

У меня была аналогичная проблема при работе с Google map в pageview, но после поиска в Интернете я получил решение, которое, наконец, сработало

Все, что я сделал, это поместил карту Google в виджет с отслеживанием состояния, использовал with AutomaticKeepAliveClientMixin и @override bool get wantKeepAlive => true; и вызвал в требуемом виджете Это виджет с отслеживанием состояния, содержащий карту Google

 class GoogleMapWidget extends StatefulWidget{
  const GoogleMapWidget({Key? key}) : super(key: key);

  @override
  _GoogleMapWidgetState createState() => _GoogleMapWidgetState();
}

class _GoogleMapWidgetState extends State<GoogleMapWidget> with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    return Container(
        child:GoogleMap(initialCameraPosition: CameraPosition(target:LatLng(0, 0)),)
    );
  }
}
  

Затем вы можете вызвать его со своей домашней страницы следующим образом

 class Homepage extends StatelessWidget {
  @override 
  build(BuildContext context){
      return PageView(
          children: <Widget>[
              GoogleMapWidget(),
              GoogleMapWidget(),

          ],
      );
   }
}
  

Я надеюсь, что это ответ, который вы ищете

Ответ №2:

не используйте Pageview вместо этого используйте PageView.builder , а затем создайте глобальный список

 List latLong = [
// pass all google maps and latLong values here
];
  

затем itemBuilder передайте latlong в соответствии с index и не забудьте включить GestureDetector на ваших GoogleMaps, иначе он также будет прокручивать карту