flutter/lib/pages/chat/menu/add_friend.dart
2025-09-18 16:13:37 +08:00

187 lines
5.7 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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: () {
// 点击按钮搜索
final value = txtcontroller.text.trim();
if (value.isNotEmpty) {
// 跳转搜索页
focusNode.unfocus();
Get.toNamed(
'/search-result',
arguments: {'searchWords': value, 'tab': 2},
);
}
},
),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(30),
borderSide: BorderSide.none,
),
filled: true,
fillColor: Colors.grey[200],
),
onSubmitted: (value) {
if (value.trim().isNotEmpty) {
// 跳转搜索页
focusNode.unfocus();
Get.toNamed(
'/search-result',
arguments: {'searchWords': value, 'tab': 2},
);
}
},
),
),
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),
// 我的二维码
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,
);
}
}