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

Flutter如何获取API数据不渲染UI并提取doctor_in布尔值?

Flutter项目获取doctor_in布尔值的代码错误修复

原本项目可通过API和DataDoctor模型类获取数据并渲染UI,现在需求改为仅获取doctor_in布尔值传入getDoctorActive()方法,但现有代码存在多处语法、逻辑错误,以下是错误分析和修复方案:


一、现有代码的核心错误点

  • 模型类类型不匹配:构造函数参数为必填非空类型,但fromJson中允许赋值null,导致类型冲突
  • getDoctorActive()逻辑无效:未定义jsonDataAsString变量,且直接给普通bool变量用.value赋值(仅ValueNotifier类支持),同时将布尔值转为字符串赋值给bool类型,类型不匹配
  • API服务类混乱:嵌套函数结构错误、状态码判断为2000(应为200)、模型类引用错误、URL拼接格式错误、map方法语法错误
  • 页面逻辑缺失:未初始化API实例、getDoctorActive()未关联真实API调用、定时器调用的方法无有效逻辑

二、修复后的完整代码

1. 修正后的DataDoctor模型类

class DataDoctor {
  String? appId;
  String? channelName;
  String? receiver_name;
  bool? doctor_in;

  DataDoctor({
    this.appId,
    this.channelName,
    this.receiver_name,
    this.doctor_in,
  });

  factory DataDoctor.fromJson(Map<String, dynamic> json) {
    return DataDoctor(
      appId: json['appId'],
      channelName: json['channelName'],
      receiver_name: json['receiver_name'],
      doctor_in: json['doctor_in'] as bool?,
    );
  }
}

2. 修正后的API服务类

import 'dart:convert';
import 'package:http/http.dart' as http;
import '../model/appIdModel.dart'; // 确保路径指向DataDoctor所在文件

class ApiService {
  Future<DataDoctor?> getData(String channelName) async {
    // 修正URL:使用查询参数传递channelName
    final String url = 'https://jsonplaceholder.typicode.com/posts/1?channelName=$channelName';
    
    final response = await http.get(Uri.parse(url));
    
    if (response.statusCode == 200) {
      // 假设接口返回单个DataDoctor对象,若返回数组可调整为取第一个元素
      Map<String, dynamic> json = jsonDecode(response.body);
      return DataDoctor.fromJson(json);
    } else {
      throw Exception('获取数据失败,状态码:${response.statusCode}');
    }
  }
}

3. 修正后的页面State逻辑

import 'dart:async';
import 'package:flutter/material.dart';
import '../services/api_service.dart';

class DoctorStatusPage extends StatefulWidget {
  final String channelName;
  const DoctorStatusPage({super.key, required this.channelName});

  @override
  State<DoctorStatusPage> createState() => _DoctorStatusPageState();
}

class _DoctorStatusPageState extends State<DoctorStatusPage> {
  Timer? timer;
  bool doctor_in = false;
  final ApiService apiService = ApiService();

  @override
  void initState() {
    super.initState();
    checkDoctorActive();
    timer = Timer.periodic(const Duration(seconds: 15), (_) => checkDoctorActive());
  }

  Future<void> checkDoctorActive() async {
    try {
      DataDoctor? data = await apiService.getData(widget.channelName);
      setState(() {
        doctor_in = data?.doctor_in ?? false;
      });
      // 将获取到的布尔值传入目标方法
      getDoctorActive(doctor_in);
    } catch (e) {
      debugPrint('获取医生状态失败:$e');
      setState(() {
        doctor_in = false;
      });
    }
  }

  // 处理doctor_in布尔值的目标方法
  void getDoctorActive(bool doctorStatus) {
    // 这里添加你的业务逻辑,比如打印状态、触发其他操作
    debugPrint('医生当前在线状态:$doctorStatus');
  }

  @override
  void dispose() {
    timer?.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 不需要渲染数据,返回基础UI即可
    return const Scaffold(
      body: Center(child: Text('后台监控医生状态中')),
    );
  }
}

三、关键修复说明

  1. 模型类:将所有字段改为可空类型,匹配接口可能返回的null值,避免类型冲突
  2. API服务:清理嵌套结构,修正状态码判断和URL格式,确保返回正确的DataDoctor对象
  3. 页面逻辑:合并API调用与状态更新逻辑,初始化API实例,修复定时器调用,添加错误处理,确保doctor_in正确传入目标方法
  4. 类型匹配:直接使用接口返回的布尔值,避免字符串转布尔的无效操作,同时处理null情况默认设为false

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:15:50