contact_list.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import 'package:e2ee_chat/azlistview/azlistview.dart';
  2. import 'package:e2ee_chat/common/api.dart';
  3. import 'package:e2ee_chat/common/global.dart';
  4. import 'package:e2ee_chat/model/contact_info.dart';
  5. import 'package:e2ee_chat/model/message.dart';
  6. import 'package:e2ee_chat/model/user.dart';
  7. import 'package:e2ee_chat/presenter/contact_list.dart';
  8. import 'package:e2ee_chat/presenter/chat_list.dart';
  9. import 'package:e2ee_chat/presenter/login.dart';
  10. import 'package:e2ee_chat/presenter/user_chat.dart';
  11. import 'package:e2ee_chat/view/user_chat.dart';
  12. import 'package:e2ee_chat/widgets/utils.dart';
  13. import 'package:flutter/material.dart';
  14. import 'package:provider/provider.dart';
  15. class ContactListView extends StatefulWidget {
  16. @override
  17. _ContactListViewState createState() => _ContactListViewState();
  18. }
  19. class _ContactListViewState extends State<ContactListView> {
  20. final presenter = ContactListPresenter();
  21. @override
  22. void initState() {
  23. super.initState();
  24. presenter.freshContacts().then((_) => setState(() {}));
  25. }
  26. @override
  27. Widget build(BuildContext context) {
  28. return ChangeNotifierProvider<ContactListPresenter>(
  29. create: (context) => presenter,
  30. child: Builder(
  31. builder: (context) {
  32. final provider = Provider.of<ContactListPresenter>(context);
  33. final contacts = provider.contacts;
  34. return RefreshIndicator(
  35. child: AzListView(
  36. data: contacts,
  37. itemCount: contacts.length,
  38. itemBuilder: (context, index) {
  39. ContactInfo info = contacts[index];
  40. return Utils.getWeChatListItem(context, info, defHeaderBgColor: Color(0xFFE5E5E5),
  41. onTap: () {
  42. if (info.getSuspensionTag() == '↑') {
  43. Navigator.of(context).pushNamed("friend request");
  44. } else {
  45. Navigator.of(context).pushNamed("user chat", arguments: info.name);
  46. }
  47. },
  48. onLongPress:() async {
  49. //TODO: 弹窗 接受 拒绝
  50. await showDialog(
  51. context: context,
  52. barrierDismissible: false,//// user must tap button!
  53. builder: (BuildContext context) {
  54. return AlertDialog(
  55. title: Text('Confirm'),
  56. content: Text('Delete friend?'),
  57. actions: <Widget>[
  58. TextButton(
  59. child: Text('No'),
  60. onPressed: () {
  61. Navigator.pop(context);
  62. },
  63. ),
  64. TextButton(
  65. child: Text('Yes'),
  66. onPressed: () {
  67. provider.deleteFriend(info.name);
  68. Navigator.pop(context);
  69. },
  70. ),
  71. ],
  72. );
  73. },
  74. );
  75. },
  76. );
  77. },
  78. physics: BouncingScrollPhysics(),
  79. susItemBuilder: (BuildContext context, int index) {
  80. ContactInfo model = contacts[index];
  81. debug('sus item build contact info: name ${model.name} tag ${model.getSuspensionTag()}');
  82. if ('↑' == model.getSuspensionTag()) {
  83. return Container();
  84. }
  85. return Utils.getSusItem(context, model.getSuspensionTag());
  86. },
  87. indexBarData: ['↑', '☆', ...kIndexBarData],
  88. indexBarOptions: IndexBarOptions(
  89. needRebuild: true,
  90. ignoreDragCancel: true,
  91. downTextStyle: TextStyle(fontSize: 12, color: Colors.white),
  92. downItemDecoration: BoxDecoration(shape: BoxShape.circle, color: Colors.green),
  93. indexHintWidth: 120 / 2,
  94. indexHintHeight: 100 / 2,
  95. indexHintDecoration: BoxDecoration(
  96. image: DecorationImage(
  97. image: AssetImage(Utils.getImgPath('ic_index_bar_bubble_gray')),
  98. fit: BoxFit.contain,
  99. ),
  100. ),
  101. indexHintAlignment: Alignment.centerRight,
  102. indexHintChildAlignment: Alignment(-0.25, 0.0),
  103. indexHintOffset: Offset(-20, 0),
  104. ),
  105. ),
  106. onRefresh: () async {});
  107. },
  108. ),
  109. );
  110. }
  111. }