flutter/lib/pages/chat/menu/add_friend.dart

187 lines
5.7 KiB
Dart
Raw Normal View History

2025-09-17 15:32:18 +08:00
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:loopin/IM/controller/im_user_info_controller.dart';
import 'package:loopin/IM/im_friend_listeners.dart';
import 'package:loopin/components/my_qrcode.dart';
import 'package:loopin/components/my_toast.dart';
import 'package:loopin/components/scan_util.dart';
import 'package:loopin/utils/scan_code_type.dart';
class AddFriend extends StatefulWidget {
const AddFriend({super.key});
@override
State<AddFriend> createState() => _AddFriendState();
}
class _AddFriendState extends State<AddFriend> {
final TextEditingController txtcontroller = TextEditingController();
final FocusNode focusNode = FocusNode();
@override
void dispose() {
txtcontroller.dispose();
super.dispose();
}
void handleScanResult(String code) {
logger.w('扫码结果11111111111111111111111$code');
// 使用外部枚举的方法检查扫码类型
final scanType = ScanCodeType.fromCode(code);
if (scanType != null) {
final value = code.substring(scanType.prefix.length + 1); // 获取后缀值
_processScanCode(scanType, value);
} else {
// 未知类型的码
Get.snackbar('未知的二维码类型', '无法识别此二维码: $code');
}
}
// 处理不同类型的扫码结果
void _processScanCode(ScanCodeType type, String value) {
switch (type) {
case ScanCodeType.verification:
_handleVerificationCode(value);
break;
case ScanCodeType.friend:
_handleFriendCode(value);
break;
case ScanCodeType.promotion:
_handlePromotionCode(value);
break;
}
}
// 处理核销码
void _handleVerificationCode(String value) async {
logger.w('处理核销码: $value');
// 带着核销码,跳转到商家的商品详情页面,引导商家去手动点击核销按钮
Get.toNamed('/sellerOrder/detail', arguments: {'writeOffCodeId': value});
}
// 处理好友码
void _handleFriendCode(String value) {
logger.w('处理好友码: $value');
// 模仿抖音,去个人页面手动点击关注
final myID = Get.find<ImUserInfoController>().userID.value;
if (myID != value) {
Get.toNamed('/vloger', arguments: {'memberId': value});
} else {
MyToast().tip(title: '这是给别人扫的,扫自己没用', position: 'top');
}
}
// 处理推广码
void _handlePromotionCode(String value) {
logger.w('处理推广码: $value');
Get.toNamed('/vloger', arguments: {'memberId': value});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
focusNode.unfocus();
},
child: Scaffold(
appBar: AppBar(
title: const Text('添加好友'),
titleTextStyle: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
color: Colors.black,
),
centerTitle: true,
),
body: ListView(
children: [
// 搜索框
Padding(
padding: const EdgeInsets.all(12.0),
child: TextField(
controller: txtcontroller,
focusNode: focusNode,
decoration: InputDecoration(
hintText: '请输入昵称',
prefixIcon: const Icon(Icons.search),
suffixIcon: TextButton(
child: Text('搜索'),
onPressed: () {
2025-09-18 16:13:37 +08:00
// 点击按钮搜索
2025-09-17 15:32:18 +08:00
final value = txtcontroller.text.trim();
if (value.isNotEmpty) {
// 跳转搜索页
focusNode.unfocus();
2025-09-18 16:13:37 +08:00
Get.toNamed(
'/search-result',
arguments: {'searchWords': value, 'tab': 2},
);
2025-09-17 15:32:18 +08:00
}
},
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Colors.grey[200],
),
onSubmitted: (value) {
if (value.trim().isNotEmpty) {
// 跳转搜索页
2025-09-18 16:13:37 +08:00
focusNode.unfocus();
Get.toNamed(
'/search-result',
arguments: {'searchWords': value, 'tab': 2},
);
2025-09-17 15:32:18 +08:00
}
},
),
),
const Divider(),
// 功能入口
_buildEntry(
icon: Icons.qr_code_scanner,
title: "扫一扫",
onTap: () {
// Get.snackbar("扫一扫", "跳转到扫码页面");
ScanUtil.openScanner(onResult: handleScanResult);
},
),
// _buildEntry(
// icon: Icons.contacts,
// title: "手机联系人",
// onTap: () {},
// ),
// _buildEntry(
// icon: Icons.people_alt_outlined,
// title: "好友推荐",
// onTap: () {},
// ),
SizedBox(height: 20),
2025-09-18 16:13:37 +08:00
// 我的二维码
2025-09-17 15:32:18 +08:00
MyQrcode(),
],
),
),
);
}
Widget _buildEntry({
required IconData icon,
required String title,
required VoidCallback onTap,
}) {
return ListTile(
leading: Icon(icon, color: Colors.blue),
title: Text(title),
trailing: const Icon(Icons.arrow_forward_ios, size: 16),
onTap: onTap,
);
}
}