如何将Dart model类数据传递到其他dart文件并作为变量使用
实现步骤及修改后代码
1. 核心修改逻辑说明
你现有代码只声明了数据模型和调用了getData方法,但缺少方法实现、空值加载判断,以及模型属性和组件的绑定逻辑,按照你的需求修改后代码如下:
2. 完整修改后的home_screen.dart代码
import 'data_model.dart'; import 'package:flutter/material.dart'; // 如果需要从接口拉取数据,可自行导入dio等网络库 class Homescreen extends StatefulWidget{ @override _HomeScreenState createState() =>_HomeScreenState(); } class _HomeScreenState extends State<Homescreen>{ List<DataModel>? model; // 新增加载状态变量,避免空值异常 bool isLoading = true; @override void initState(){ getData(); super.initState(); } // 补全getData方法实现 Future<void> getData() async { // 场景1:使用模拟数据测试,可直接运行验证效果 List<DataModel> dataList = [ DataModel( buttonLetter: "登录", buttonHeight: 60, buttonWidth: 200, buttonStartingXpoint: 50, buttonStartingYpoint: 300 ) ]; // 场景2:如果是从接口拉取解析数据,替换上面的模拟代码即可 // final response = await Dio().get("你的业务接口地址"); // List<DataModel> dataList = (response.data as List).map((item) => DataModel.fromJson(item)).toList(); setState(() { model = dataList; isLoading = false; }); } @override Widget build(BuildContext context){ return Scaffold( appBar: AppBar(title: const Text('Project'),), body: Center( // 加载状态判断:加载中显示加载指示器,加载完成再渲染组件 child: isLoading ? const CircularProgressIndicator() : SizedBox( // 注意SizedBox宽高要求double类型,需要做类型转换 width: model![0].buttonWidth.toDouble(), height: model![0].buttonHeight.toDouble(), child: Center(child: Text(model![0].buttonLetter)), ) ), ); } }
3. 可选优化点
你当前DataModel的fromJson方法中空判断逻辑无效,??后还是同一个字段,没有兜底逻辑,建议修改为指定默认值,避免接口字段缺失时报错:
DataModel.fromJson(Map<String, dynamic> json): buttonLetter = json['Button_letter'] ?? '默认按钮', buttonHeight = json['Button_height'] ?? 50, buttonWidth = json['Button_width'] ?? 150, buttonStartingXpoint = json['Button_Starting_xpoint'] ?? 0, buttonStartingYpoint = json['Button_Starting_ypoint'] ?? 0;
其他说明
如果你需要渲染列表中所有的DataModel数据,把SizedBox替换成ListView.builder遍历model列表即可;如果你的数据只有1条,可直接把List<DataModel>? model改成DataModel? model,不需要用列表类型。
内容的提问来源于stack exchange,提问作者Oni Sama
相关产品推荐
相关产品推荐

