Flutter如何更新变量并在其他有状态小部件中使用它们?

时间:2019-04-08 07:15:34

标签: dart 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(

我需要为“标记”小部件使用新值。它在另一个.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(),
  ),
)

非常感谢您能提供的任何帮助

2 个答案:

答案 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()时,标记小部件都会更新。