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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:39:03