under_guardian_view.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:get/get.dart';
  4. import 'package:trackoffical_app/logger.dart';
  5. import 'package:trackoffical_app/model/m_net_image.dart';
  6. import 'package:trackoffical_app/screen.dart';
  7. import 'package:trackoffical_app/service/api.dart';
  8. import 'package:trackoffical_app/view/ingame/in_game_loading.dart';
  9. import 'package:trackoffical_app/widget/app_top_bar.dart';
  10. import 'package:trackoffical_app/pb.dart' as pb;
  11. import '../../widget/app_net_image.dart';
  12. import '../../widget/circle_head.dart';
  13. class UnderGuardianView extends StatefulWidget {
  14. const UnderGuardianView({super.key});
  15. @override
  16. State<StatefulWidget> createState() {
  17. return UnderGuardianViewState();
  18. }
  19. }
  20. class UnderGuardianViewState extends State<UnderGuardianView> {
  21. var data = <pb.MyPupil>[];
  22. var phone = '';
  23. final api = ApiService.to;
  24. Timer? _flushTimer;
  25. var lastData = '';
  26. @override
  27. void initState() {
  28. super.initState();
  29. api.underGuardianList().then((value) {
  30. setState(() {
  31. data = value;
  32. });
  33. });
  34. _flushTimer = Timer.periodic(2.seconds, (timer) {
  35. if(Get.currentRoute!= '/UnderGuardianView'){
  36. return;
  37. }
  38. api.underGuardianList().then((value) {
  39. final valueStr = value.toString();
  40. if(valueStr!= lastData){
  41. lastData=valueStr;
  42. setState(() {
  43. data = value;
  44. });
  45. }
  46. });
  47. });
  48. }
  49. @override
  50. void dispose() {
  51. super.dispose();
  52. _flushTimer?.cancel();
  53. }
  54. @override
  55. Widget build(BuildContext context) {
  56. return Scaffold(
  57. appBar: AppTopBar(
  58. title: const Text('被监护人'),
  59. automaticallyImplyLeading: true,
  60. // actions: [
  61. // IconButton(onPressed: onAdd, icon: const Icon(Icons.add)),
  62. // ],
  63. ),
  64. body: Padding(
  65. padding: const EdgeInsets.all(12),
  66. child: ListView.builder(
  67. itemCount: data.length,
  68. itemBuilder: (context, i) {
  69. return elem(data[i]);
  70. })),
  71. );
  72. }
  73. Widget elem(pb.MyPupil info) {
  74. return GestureDetector(
  75. onTap: ()=>onWatch(info),
  76. child:Card(
  77. surfaceTintColor: Colors.white,
  78. color: Colors.white,
  79. child: Container(
  80. height: 18.9.wp,
  81. alignment: Alignment.center,
  82. child: ListTile(
  83. leading: CircleHead(
  84. diameter: 11.7.wp,
  85. child: AppNetImage(netImage: info.image.toModel()),
  86. ),
  87. title: Text(info.name, style: TextStyle(fontSize: 4.4.wp),),
  88. trailing: Row(
  89. mainAxisSize: MainAxisSize.min,
  90. children: [
  91. Text(info.isInGame? info.actName: '未参加活动', style: TextStyle(fontSize: 3.89.wp, color: Colors.grey),),
  92. const Icon(Icons.arrow_forward_ios_rounded, color: Colors.grey,)
  93. ],
  94. ),
  95. ),
  96. ),
  97. )
  98. );
  99. }
  100. onWatch(pb.MyPupil info)async{
  101. if(info.isInGame){
  102. InGameLoadingView.toGuardian(info.id);
  103. }
  104. }
  105. onAdd() async {
  106. await Get.dialog(AlertDialog(
  107. title: const Text('添加被监护人'),
  108. content: TextField(
  109. onChanged: (v) {
  110. phone = v;
  111. },
  112. keyboardType: TextInputType.phone,
  113. ),
  114. actions: [
  115. TextButton(onPressed: () => Get.back(), child: const Text('取消')),
  116. FilledButton(
  117. onPressed: () async {
  118. if (phone.isEmpty) {
  119. Get.snackbar('添加失败', '不能为空');
  120. return;
  121. }
  122. // await api.guardianAdd(phone);
  123. final newList = await api.underGuardianList();
  124. setState(() {
  125. data = newList;
  126. });
  127. Get.back();
  128. },
  129. child: const Text('确定'))
  130. ],
  131. ));
  132. }
  133. }