我想做的是,当我点击列表图块时,它会在地图上的位置(基于纬度和经度)上生成新的标记。
但是变量不会更新,仅显示初始值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(
我需要为“标记”小部件使用新值。它在另一个.dart文件中的另一个statefulwidget中。
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)
point: LatLng(UpdatedStoresListState().updatedLat, UpdatedStoresListState().updatedLon)
这是完全错误的,我建议您开始使用redux或bloc,因为您正在管理大型且共享的应用程序状态。
答案 1 :(得分:0)
如果您有兴趣使用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(),
),
);
},
)
就是这样,每当您调用BLoC的updateLatLong()时,标记小部件都会更新。