You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何在一个StatefulWidget中获取另一个StatefulWidget的状态数据

问题根因
  • curLoc是_MapState类的私有属性,不属于MapsClass Widget类本身,你直接实例化MapsClass肯定访问不到该变量
  • Flutter中的Widget只是配置类,单独实例化不会触发生命周期执行位置加载逻辑,就算能访问拿到的也是空值
  • Flutter页面间传递参数的正确逻辑是跳转时由上游页面向下游页面传参,不是下游页面主动去拿上游页面的属性
修复步骤

第一步:给AddData新增接收位置参数的构造函数

修改AddData页面的代码,新增参数接收逻辑,删除你原有主动实例化MapsClass拿变量的代码:

import 'package:donation_yoga/screens/maps.dart';
import 'package:donation_yoga/services/Submitform.dart';
import 'package:flutter/material.dart';

class AddData extends StatefulWidget {
  // 新增接收位置的参数
  final Position curLoc;
  // 新增构造函数
  const AddData({Key? key, required this.curLoc}) : super(key: key);

  @override
  _AddData createState() => _AddData();
}

class _AddData extends State<AddData> {
  final _formKey = GlobalKey<FormState>();
  final _user = DataPush();
  // 直接通过widget取上游传过来的位置,删掉你原来写的ma和position两行代码
  Position get position => widget.curLoc;

  // 剩下的原有代码不变
  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    // 原有build逻辑不变
    return Scaffold(
        appBar: AppBar(title: Text('ADD YOUR CENTER')),
        // 剩余原有布局代码不变
    );
  }

  _showDialog(BuildContext context) {
    Scaffold.of(context)
        .showSnackBar(SnackBar(content: Text('Submitting form')));
  }
}

第二步:修改MapsClass的跳转逻辑,传递位置参数

找到MapsClass中悬浮按钮的跳转逻辑,跳转时把已加载好的curLoc传给AddData:

FloatingActionButton(
  backgroundColor: Colors.green,
  child: const Icon(Icons.create),
  onPressed: () {
    // 加个空判断避免位置还没加载完就跳转
    if (curLoc == null) {
      ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("位置正在加载中,请稍候再试")));
      return;
    }
    Navigator.push(
      context,
      // 构造AddData时传入curLoc
      MaterialPageRoute(builder: (context) => AddData(curLoc: curLoc)),
    );
  },
)

内容的提问来源于stack exchange,提问作者artistAhmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 09:48:04