Flutter向Stateful Widget传递数据失败:请求排查与修正
问题修正方案
错误原因解析
- 第一个错误是因为你在
DataScreen类外部定义了全局zipCode变量,但类内部未声明对应成员字段,构造函数里的this.zipCode无法匹配类属性。 - 第二个错误是第一个问题的连锁反应——
DataScreen类未正确定义zipCode成员,导致state里的widget.zipCode无法正常访问。
修正后的完整代码
class DataScreen extends StatefulWidget { // 在类内部声明成员变量,用final保证不可变性(符合StatefulWidget设计规范) final String zipCode; // 修正构造函数,初始化类的zipCode成员,添加required确保参数必填(null安全要求) const DataScreen({required this.zipCode, super.key}); @override _DataScreenState createState() => _DataScreenState(); } class _DataScreenState extends State<DataScreen> { List<PropertyInformation> propertyList = []; bool isLoaded = false; Future<void> getItems() async { setState(() { isLoaded = true; }); var client = http.Client(); try { // 现在可正常访问widget.zipCode var url = Uri.parse( "https://realty-mole-property-api.p.rapidapi.com/properties?zipCode=${widget.zipCode}"); final response = await client.get( url, headers: { 'X-RapidAPI-Key': '51ced1b32emsh509f82e1d58ae16p1ad6e6jsn75d75166a8b4', 'X-RapidAPI-Host': 'realty-mole-property-api.p.rapidapi.com' }, ); if (response.statusCode == 200) { var jsonData = jsonDecode(response.body); for (var element in jsonData) { element.removeWhere((key, value) => key == null || value == null); } for (var i in jsonData) { propertyList.add(PropertyInformation.fromJson(i)); } } else { //print('Status Code: ${response.statusCode}'); } } catch (e) { setState(() { isLoaded = false; }); log("error $e"); } setState(() { isLoaded = false; }); } @override void initState() { getItems(); super.initState(); } }
额外注意事项
- 删除原来全局的
const String zipCode = '';,避免变量名冲突。 - 构造函数的
required关键字是Flutter null安全的规范要求,和你页面1的调用方式DataScreen(zipController.text)兼容,也可以改成更清晰的命名参数调用:DataScreen(zipCode: zipController.text)。 - 请勿在公开代码中暴露API密钥,建议通过环境变量或配置文件管理敏感信息。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

