Флаттер; Передача Set<Marker> _markers = {} с одного экрана на другой

Я делаю флаттер-приложение, которое добавляет маркеры на карту в зависимости от текущего местоположения. У меня есть информационный экран, который берет информацию о пользователе и передает эту информацию маркеру, который будет добавлен на флаттер-карты Google. У меня проблемы с передачей набора маркеров в мой map_view.dart. Ниже приведена функция Future для добавления маркеров на карту из текущего местоположения и последующего перехода к экрану карты с набором _marker, объявленным в

создание функции Future с именем _addMarker(), которая будет получать текущее местоположение пользователя, размещать маркер в этой точке и возвращаться к экрану map_view.dart.

Экран info_window.dart.

    final Set<Marker> _markers = {};
    Future<void> _addMarker() async {
    getUserCurrentLocation().then((value) async {
      //print(value.latitude.toString() + " " + value.longitude.toString());
      String ID;
      // marker added for current users location
      int x = 2;
      x + 1;
      ID = x.toString();

      _markers.add(Marker(
        markerId: MarkerId(ID), //this can be taken from the other screen maybe
        position: LatLng(value.latitude, value.longitude),
        infoWindow: InfoWindow(
          title: 'My Current Location',
          snippet: 'captured from info window too',
          onTap: () => _goToInfoScreen(),
        ),
      ));
      Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => MapSample(_markers),
          ));
    });


        setState(() {
          //_markers = result as Set<Marker>;
        });
        //});

      }

И сделайте это для моего экрана map_view.dart, пытаясь установить маркер, который будет использоваться на этом экране.

экран map_view.dart

class MapSample extends StatefulWidget {
  //Set<Marker> markers = {};

  const MapSample(Set<Marker> marker, {Key? key}) : super(key: key);

  @override
  State<MapSample> createState() => MapSampleState();
}

//late final Set<Marker> _markers;

//marker = MapSample(_markers);

class MapSampleState extends State<MapSample> {
...

Я борюсь с использованием этой переменной после того, как она будет передана на этот экран, при попытке использовать переменную маркера для добавления маркеров на карту, которые они никогда не появляются. Есть ли другой/любой способ получить набор на экране map_view.dart после того, как он будет передан из навигатора на экране info_window.dart?

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите использовать переменные внутри класса State, происходящего из основного класса, расширяющего StatefulWidget, вам нужно использовать widget.variable. В вашем случае это widget.marker.

class MapSample extends StatefulWidget {
  //Set<Marker> markers = {};

  const MapSample(Set<Marker> marker, {Key? key}) : super(key: key);

  @override
  State<MapSample> createState() => MapSampleState();
}

//late final Set<Marker> _markers;

//marker = MapSample(_markers);

class MapSampleState extends State<MapSample> {

  late Type foo;

  @override
  void initState() {
    foo = widget.foo;
    super.initState();
}

Нужно ли для этого создавать переменную с именем marker? также я пытался реализовать и получить ошибки, говорящие о том, что инициализатор не может получить доступ к члену экземпляра «виджет».

Spencer Maginsky 21.11.2022 01:40

Вам не нужно назначать его новой переменной. Вы можете напрямую вызвать widget.marker внутри вашего метода сборки класса State.

Soliev 21.11.2022 01:43

Извините, я забыл упомянуть, что вы можете вызвать его внутри метода сборки или initState

Soliev 21.11.2022 01:47

Я понял, что проблема недоступна для виджета, но теперь он говорит: «Маркер получателя» не определен для типа «MapSample». Попробуйте импортировать библиотеку, которая определяет «маркер», исправив имя на имя существующего геттер или определение геттера или поля с именем «маркер». Это потому, что это не объявлено заранее?

Spencer Maginsky 21.11.2022 01:55

Поделитесь, где вы объявили marker?

Soliev 23.11.2022 00:49

маркер определен в MapSample(Set<Marker> marker,...), поэтому он может принимать этот параметр, а значение, которое используется для этого параметра, определяется на экране info_window.dart, отображаемом в верхней части первого фрагмента. Затем код отправляется на экран Map_view в функции _addMarker. Нужно ли объявлять переменную и устанавливать ее в качестве маркера в MapSample(). Маркер не определен на экране map_view, но в окне info_window и с точками останова я подтвердил, что значение отправляется, но использование этого значения все еще остается проблемой.

Spencer Maginsky 25.11.2022 22:57

Я смог заставить его работать, решение было проще, чем я думал, мне нужно было определить маркер как MapSample(this.marker,...), а затем определить его как Set<Marker> marker = {}. после этого я смог использовать это значение с widget.merker в методе сборки, спасибо за помощь

Spencer Maginsky 25.11.2022 23:53

Другие вопросы по теме