guardian_view.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. import 'package:flutter/material.dart';
  2. import 'package:get/get.dart';
  3. import 'package:trackoffical_app/service/api.dart';
  4. import 'package:trackoffical_app/utils.dart';
  5. import 'package:trackoffical_app/widget/app_dialog.dart';
  6. import 'package:trackoffical_app/widget/app_top_bar.dart';
  7. import 'package:trackoffical_app/pb.dart' as pb;
  8. class GuardianView extends StatefulWidget {
  9. const GuardianView({super.key});
  10. @override
  11. State<StatefulWidget> createState() {
  12. return GuardianViewState();
  13. }
  14. }
  15. class GuardianViewState extends State<GuardianView> {
  16. var data = <pb.CareTakerInfo>[];
  17. var phone = '';
  18. var memo = '';
  19. final api = ApiService.to;
  20. final Rx<String?> textErr = Rx(null);
  21. @override
  22. void initState() {
  23. super.initState();
  24. api.guardianList().then((value) {
  25. setState(() {
  26. data = value;
  27. });
  28. });
  29. }
  30. validateMobile(String value) {
  31. const pattern = r'(^(?:[+0]9)?[0-9]{10,12}$)';
  32. final regExp = RegExp(pattern);
  33. if (value.isEmpty) {
  34. textErr.value = '请输入手机号';
  35. } else if (!regExp.hasMatch(value)) {
  36. textErr.value = '请输入正确的手机号';
  37. }else{
  38. textErr.value = null;
  39. }
  40. }
  41. @override
  42. Widget build(BuildContext context) {
  43. return Scaffold(
  44. appBar: AppTopBar(
  45. title: const Text('监护人'),
  46. automaticallyImplyLeading: true,
  47. actions: [
  48. IconButton(onPressed: onAdd, icon: const Icon(Icons.add)),
  49. ],
  50. ),
  51. body: Padding(
  52. padding: const EdgeInsets.all(12),
  53. child: ListView.builder(
  54. itemCount: data.length,
  55. itemBuilder: (context, i) {
  56. return elem(data[i]);
  57. })),
  58. );
  59. }
  60. Widget elem(pb.CareTakerInfo info) {
  61. return Card(
  62. child: ListTile(
  63. title: Text(info.memo.isNotEmpty? info.memo: info.cPhone),
  64. trailing: info.isLock
  65. ? const IconButton(onPressed: null, icon: Icon(Icons.lock_outline))
  66. : IconButton(
  67. onPressed: () => onDelete(info),
  68. icon: const Icon(Icons.delete)),
  69. ),
  70. );
  71. }
  72. onDelete(pb.CareTakerInfo info) async {
  73. await Get.dialog(AppDialog(
  74. title: const Text('确认删除监护人?'),
  75. content: Text(info.memo.isNotEmpty? info.memo: info.cPhone),
  76. onCancel: () => Get.back(),
  77. onConfirm: () async {
  78. await api.guardianDel(info);
  79. final newList = await api.guardianList();
  80. setState(() {
  81. data = newList;
  82. });
  83. Get.back();
  84. },
  85. ));
  86. }
  87. onAdd() async {
  88. final phoneController = TextEditingController();
  89. await Get.dialog(AlertDialog(
  90. title: const Text('添加监护人'),
  91. content: Column(
  92. mainAxisSize: MainAxisSize.min,
  93. children: [
  94. TextField(
  95. onChanged: (v) {
  96. memo = v.trim();
  97. },
  98. decoration: const InputDecoration(
  99. hintText: '昵称',
  100. ),
  101. maxLength: 20,
  102. ),
  103. Obx(()=>TextField(
  104. onChanged: (v) {
  105. phone = v.trim();
  106. },
  107. controller: phoneController,
  108. keyboardType: TextInputType.phone,
  109. decoration: InputDecoration(
  110. hintText: '手机号码',
  111. errorText: textErr.value
  112. ),
  113. ))
  114. ],
  115. ) ,
  116. actions: [
  117. TextButton(onPressed: () => Get.back(), child: const Text('取消')),
  118. FilledButton(
  119. onPressed: () async {
  120. validateMobile(phone);
  121. if(textErr.value!= null){
  122. return;
  123. }
  124. tryCatchApi(() async{
  125. await api.guardianAdd(phone, memo);
  126. }, onError: (e){
  127. textErr.value = e.message;
  128. return true;
  129. }, onSuccess: ()async{
  130. final newList = await api.guardianList();
  131. setState(() {
  132. data = newList;
  133. });
  134. Get.back();
  135. });
  136. },
  137. child: const Text('确定'))
  138. ],
  139. ));
  140. }
  141. }