Что я пытаюсь сделать, так это то, что когда я нажимаю плитку списка, она создает новый маркер в своем местоположении (на основе широты и долготы) на карте.
но переменные не обновляются и показывают только начальное значение, равное 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(),
),
)
Я очень ценю любую помощь, которую вы можете предоставить
point: LatLng(UpdatedStoresListState().updatedLat, UpdatedStoresListState().updatedLon)
Это совершенно неправильно, я советую вам начать использовать redux или block, потому что вы управляете большим и общим состоянием приложения.
Я рекомендую redux
это немного сложно, но очень эффективно!
Спасибо. Я беспокоюсь, но также рад изучить редукцию для своего приложения.
Если вы заинтересованы в том, чтобы сделать это с помощью 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, ваш маркерный виджет будет обновляться.
Это здорово! ваше руководство очень помогает мне понять блок в моем приложении. Спасибо
Я хотел избежать продвинутых структурных моделей, поскольку они кажутся мне немного сложными для изучения, но я не заметил, что сделал большую ошибку в statefulwidget, пока вы не указали. Спасибо. Я посмотрю на блок или редукс. какой из них вы рекомендуете?