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('后台监控医生状态中')), ); } }
三、关键修复说明
- 模型类:将所有字段改为可空类型,匹配接口可能返回的null值,避免类型冲突
- API服务:清理嵌套结构,修正状态码判断和URL格式,确保返回正确的
DataDoctor对象 - 页面逻辑:合并API调用与状态更新逻辑,初始化API实例,修复定时器调用,添加错误处理,确保
doctor_in正确传入目标方法 - 类型匹配:直接使用接口返回的布尔值,避免字符串转布尔的无效操作,同时处理null情况默认设为false
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

