Flutter, как обновить переменные и использовать их в другом виджете с отслеживанием состояния?

Что я пытаюсь сделать, так это то, что когда я нажимаю плитку списка, она создает новый маркер в своем местоположении (на основе широты и долготы) на карте.

но переменные не обновляются и показывают только начальное значение, равное 0. Если я удалю 0 и начну горячую перезагрузку, они будут распечатаны как нулевые.

class UpdatedStoresListState extends State<UpdatedStoresList> {

  double updatedLat = 0;
  double updatedLon = 0;

  @override
  void initState() {
    super.initState();
  }

он генерирует новую широту и долготу, когда я нажимаю виджет ListTile.

class UpdatedStoresListState extends State<UpdatedStoresList> {
...

children: <Widget>[
  GestureDetector(
    onTap: () {
      setState(() {
        updatedLat = snapshot.data[index].latitude;
        updatedLon = snapshot.data[index].longitude;
        print('Lat: $updatedLat');
        // 52.902...
        print('Lon: $updatedLon');
        // -129.9031...
      });
    },
    child: ListTile(

Мне нужно использовать новые значения для виджета «Маркер». Он находится в другом statefulwidget в другом файле .dart.

class _MainMapState extends State<MainMap> {
...

Marker(
  width: 40.0,
  height: 40.0,
  point: LatLng(UpdatedStoresListState().updatedLat, UpdatedStoresListState().updatedLon),
  builder: (ctx) => Container(
    child: FlutterLogo(),
  ),
)

Я очень ценю любую помощь, которую вы можете предоставить

0
0
2 909
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

point: LatLng(UpdatedStoresListState().updatedLat, UpdatedStoresListState().updatedLon) Это совершенно неправильно, я советую вам начать использовать redux или block, потому что вы управляете большим и общим состоянием приложения.

Я хотел избежать продвинутых структурных моделей, поскольку они кажутся мне немного сложными для изучения, но я не заметил, что сделал большую ошибку в statefulwidget, пока вы не указали. Спасибо. Я посмотрю на блок или редукс. какой из них вы рекомендуете?

ssonmo 08.04.2019 09:40

Я рекомендую redux это немного сложно, но очень эффективно!

Taym95 08.04.2019 10:52

Спасибо. Я беспокоюсь, но также рад изучить редукцию для своего приложения.

ssonmo 08.04.2019 11:20
Ответ принят как подходящий

Если вы заинтересованы в том, чтобы сделать это с помощью BLoC, выполните следующие действия: Создайте файл lat_long_bloc.dart и создайте в нем BLoC, как показано ниже.

class LatLongBloc {
   StreamController _latLongStreamController = StreamController<LatLong>();

   Stream get latLongStream => _latLongStreamController.stream;

   dispose(){
     _latLongStreamController.close();
   }

   updateLatLong(LatLng latLong){
     _latLongStreamController.sink.add(latLong);
   }
}

final latLongBloc = LatLongBloc();

И в вашем GestureDetecture измените свой код как:

GestureDetector(
    onTap: () {
      updatedLat = snapshot.data[index].latitude;
      updatedLon = snapshot.data[index].longitude;
      latLongBloc.updateLatLong(LatLng(updatedLat , updatedLon ));
    },
    child: ListTile(

И оберните свой маркер с помощью StreamBuilder:

StreamBuilder(
        stream: latLongBloc.latLongStream,
        builder: (context, snapshot) {
          LatLng latLog = snapshot.data;
          return Marker(
            width: 40.0,
            height: 40.0,
            point: LatLng(latLog.lat, latLog.long),
            builder: (ctx) => Container(
              child: FlutterLogo(),
            ),
          );
        },
      )

Вот и все, всякий раз, когда вы будете вызывать updateLatLong() вашего BLoC, ваш маркерный виджет будет обновляться.

Это здорово! ваше руководство очень помогает мне понять блок в моем приложении. Спасибо

ssonmo 08.04.2019 18:43

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