随诊医生社区医生版极速开发直播1.3

在上一节中,我们开发了主界面框架,主体结构是底部为TabBar,分别对应5个页面:日程、患 者、消息、医院、我的。在这一节中,我们将以日程页面为例,介绍列表控件的使用。

功能需求

在日程页面中将显示医生的日程安排,包括:坐诊、执班、预约、随访、出诊、家访。下面分别来进行介绍:

  • 坐诊
    坐诊指医生在医院出诊情况,需记录如下信息:医院、科室、级别、开始时间、结束时间,与HIS系统打通后,可以看到就诊患者列表,以及患者的病历。
  • 执班
    执班是指医生在医院工作但是不出诊情况。
  • 预约
    预约是指患者主动向医生发起预约,由医生同意后,形成的预约,包括:就诊医院、就诊科室、就诊时间(以半小时为限),患者在预约时可以通过图文及声音形式描述自己的病情,医生可以根据患者自述决定是否接受预约。
  • 随访
    医生在医院通过电话、短信或图文信息形式,询问患者病情、康复情况和医嘱遵从情况。
  • 出诊
    医生主动到患者家中进行诊疗活动的计划安排,包括:时间、地点、患者,医生可以在出诊现场查看患者病历,提出建议,并开具处方药品,这部分功能需要与HIS打通。
  • 家医
    医护人员到患者家中进行医疗活动的服务,如输液、换药等。
    这六种情况统一在列表中显示,医生可以选择只看其中的一种,还可以按照时间和类别进行查询,每个类别均有相应的详细信息页面,有些页面还可以查看患者的详细信息,进一步查看患者的病历。
    基本功能介绍完之后,下面我们来看如何用Flutter实现这一功能。

列表功能实现

我们把项目中所有的界面中组件,放在components目录下,所以我们需要在项目的lib文件夹下,新建一个components文件夹。
我们第一期先显示出诊和预约两种日程条目,我们首先定义一个日程列表条目的基类ScheduleListItem,该类只相当于一个接口,所以定义为抽象类,如下所示:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

abstract class ScheduleListItem {}

我们接着来定义出诊日程条目,该条目需要记录时间、地点和患者等信息,如下所示:

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:szys/components/ScheduleListItem.dart';

class OnsiteScheduleListItem implements ScheduleListItem {
  final scheduleId;
  final String planTime;
  final String planAddr;
  final int patientId;
  final String patientName;

  OnsiteScheduleListItem(this.scheduleId, this.planTime, this.planAddr, 
      this.patientId, this.patientName);
}

接下来我们定义预约条目,该条目需要记录出诊医院、科室、时间、预约状态、患者等信息,如下所示:

class AppointScheduleListItem implements ScheduleListItem {
  final int scheduleId;
  final int hospitalId;
  final String hospitalName;
  final int deptId;
  final String deptName;
  final int appointId;
  final String appointTime;
  final int appointStateId;
  final String appointStateName;
  final int patientId;
  final String patientName;

  AppointScheduleListItem(this.scheduleId, this.hospitalId,
          this.hospitalName, this.deptId, this.deptName,
          this.appointId, this.appointTime, this.appointStateId,
          this.appointStateName, this.patientId, this.patientName);
}

我们定义日程的ListView类ScheduleListView,代码如下所示:

import 'package:flutter/material.dart';
import 'package:szys/components/ScheduleListItem.dart';
import 'package:szys/components/OnsiteScheduleListItem.dart';
import 'package:szys/components/AppointScheduleListItem.dart';

class ScheduleListView extends StatefulWidget {
  @override
  ScheduleListViewState createState() => new ScheduleListViewState();
}

class ScheduleListViewState extends State<ScheduleListView> {
  @override
  Widget build(BuildContext context) {
    List<ScheduleListItem> items = getScheduleListItems(1001);
    return new ListView.builder(
      itemCount: items.length,
      itemBuilder: (context, index) {
        final item = items[index];
        if (item is OnsiteScheduleListItem) {
          return buildOnsiteListTile(item);
        } else if (item is AppointScheduleListItem) {
          return buildAppointListItem(item);
        } else {
          return new ListTile(
            isThreeLine: true,//子item的是否为三行
            dense: false,
            leading: new CircleAvatar(child: new Text('未知'),),//左侧首字母图标显示,不显示则传null
            title: new Text('未知标题'),//子item的标题
            subtitle: new Text('未知内容'),//子item的内容
            trailing: new Icon(Icons.arrow_right,color: Colors.lightBlue,),//显示右侧的箭头,不显示则传null
          );
        }
      },
    );
  }
  ......
}

这里面最重要的就是build方法,由该方法产生界面中可显示的内容。在一开始,我们根据医生的编号获取医生的日程列表,getScheduleListItems函数是用程序写死的列表数据,还没有从服务器上取。
接着我们调用listView.builder方法,在其中的itemBuilder中,我们遍历列表条目,对于每个条目我们判断其类型,如果是出诊类型,则由buildOnsiteScheduleListItem来生成对应的列表条目,如果是预约类型,则由buildAppointScheduleListItem来生成对应的列表条目,如果都不是,则显示未知类型条目。
接下来我们来看生成测试条目的函数实现:

List<ScheduleListItem> getScheduleListItems(int doctorId) {
    List<ScheduleListItem> items = new List<ScheduleListItem>();
    ScheduleListItem item = new OnsiteScheduleListItem(1,
        '2018-07-28 10:00:00', '中关村双榆树小区6#305',
        101, '张新中');
    items.add(item);
    //
    item = new OnsiteScheduleListItem(2,
        '2018-07-28 10:30:00', '中关村双榆树小区8#205',
        102, '王水');
    items.add(item);
    ......
    return items;
}

接下来我们看出诊日程列表条目的生成:

  Widget buildOnsiteListTile(OnsiteScheduleListItem item) {
    return new ListTile(
      isThreeLine: true,//子item的是否为三行
      dense: false,
      leading: new CircleAvatar(child: new Text('出诊'),),//左侧首字母图标显示,不显示则传null
      title: new Text('出诊患者:' + item.patientName),//子item的标题
      subtitle: new Text('时间:' + item.planTime +
              '\r\n地址:' + item.planAddr),//子item的内容
      trailing: new Icon(Icons.arrow_right,color: Colors.lightBlue,),//显示右侧的箭头,不显示则传null
    );
  }

我们再来看预约列表条目生成:

  Widget buildAppointListItem(AppointScheduleListItem item) {
    return new ListTile(
      isThreeLine: true,//子item的是否为三行
      dense: false,
      leading: new CircleAvatar(child: new Text('预约'),),//左侧首字母图标显示,不显示则传null
      title: new Text('' + item.hospitalName + item.deptName),//子item的标题
      subtitle: new Text('时间:' + item.appointTime +
          '\r\n状态:' + item.appointStateName +
          '\r\n患者:' + item.patientName),//子item的内容
      trailing: new Icon(Icons.arrow_right,color: Colors.lightBlue,),//显示右侧的箭头,不显示则传null
    );
  }

我们把日程列表内容的生成和显示已经做好了,接下来我们将其加入我们的日程页面,打开SchedulePage类,将其中的center替换为ScheduleListView

import 'package:szys/components/ScheduleListView.dart';

......

class SchedulePageState extends State<SchedulePage> {
  @override
  Widget build(BuildContext context) {
    //items.add(value);
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('日程管理')
      ),
      body: new Center(
        child: new ScheduleListView()
      )
    );
  }
}

我们保存上述修改,直接到手机上来查看,我们将看到一个如下所示的列表页面:


a001.jpg

在这一节中,我们实现了一个最简单的列表页面,当然还没有加下拉刷新和上拉加载更多的功能,我们准备在下一个版本中再添加相应的功能。
在这里我们的列表内容还是静态的,在下一节中,我们将从网络获取数据并显示到界面中,静请期待。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容