Files
tongxunruanjian/mobile-next/lib/pages/contacts/group_requests/group_requests_view.dart
T
编码工程师andmultica-agent 8046ec7483 feat(mobile-next): 导入官方 openim-flutter-demo 固定基线 3.8.3-patch.3 并完成双构建
- 上游: github.com/OpenIMSDK/openim-flutter-demo tag 3.8.3-patch.3
  commit b3dfdb1e8aaeaaf6f0793e10cadd20d5c184a31f
- 并行目录 mobile-next/ 原样导入(含 LICENSE),不覆盖现网 mobile/
- 锁定 Flutter 3.24.5 / Dart 3.5.4 / JDK 17 / Gradle 7.6.3 / AGP 7.3.1
- 实测 Android debug 与 release 构建均成功(见 docs/mobile-next-baseline-import.md)
- 本提交可单独回退:git revert 1db1229(重写前)

Co-authored-by: multica-agent <github@multica.ai>
2026-08-19 15:24:33 +08:00

137 lines
5.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:openim_common/openim_common.dart';
import 'package:sprintf/sprintf.dart';
import 'group_requests_logic.dart';
class GroupRequestsPage extends StatelessWidget {
final logic = Get.find<GroupRequestsLogic>();
GroupRequestsPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: TitleBar.back(title: StrRes.newGroupRequest),
backgroundColor: Styles.c_F8F9FA,
body: Obx(() => ListView.builder(
padding: EdgeInsets.only(top: 10.h),
itemCount: logic.list.length,
itemBuilder: (_, index) => _buildItemView(logic.list[index]),
)),
);
}
Widget _buildItemView(GroupApplicationInfo info) {
final isISendRequest = info.userID == OpenIM.iMManager.userID;
return Container(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 10.h),
decoration: BoxDecoration(
color: Styles.c_FFFFFF,
border: BorderDirectional(
bottom: BorderSide(color: Styles.c_F8F9FA, width: 1.h),
),
),
child: Row(
children: [
Expanded(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
AvatarView(
url: info.userFaceURL,
text: info.nickname,
),
10.horizontalSpace,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: [
(info.nickname ?? '').toText
..style = Styles.ts_0C1C33_17sp
..maxLines = 1
..overflow = TextOverflow.ellipsis,
4.verticalSpace,
if (!logic.isInvite(info))
RichText(
text: TextSpan(
text: StrRes.applyJoin,
style: Styles.ts_8E9AB0_14sp,
children: [
WidgetSpan(child: 2.horizontalSpace),
TextSpan(
text: logic.getGroupName(info),
style: Styles.ts_0089FF_14sp,
),
],
),
)
else
RichText(
text: TextSpan(
text: logic.getInviterNickname(info),
style: Styles.ts_0089FF_14sp,
children: [
WidgetSpan(child: 2.horizontalSpace),
TextSpan(
text: StrRes.invite,
style: Styles.ts_8E9AB0_14sp,
),
WidgetSpan(child: 2.horizontalSpace),
TextSpan(
text: info.nickname,
style: Styles.ts_0089FF_14sp,
),
WidgetSpan(child: 2.horizontalSpace),
TextSpan(
text: StrRes.joinIn,
style: Styles.ts_8E9AB0_14sp,
),
WidgetSpan(child: 2.horizontalSpace),
TextSpan(
text: logic.getGroupName(info),
style: Styles.ts_0089FF_14sp,
),
],
),
),
if (null != IMUtils.emptyStrToNull(info.reqMsg))
Padding(
padding: EdgeInsets.only(top: 4.h),
child: sprintf(StrRes.applyReason, [info.reqMsg!]).toText
..style = Styles.ts_8E9AB0_14sp
..maxLines = 1
..overflow = TextOverflow.ellipsis,
),
],
),
)
],
),
),
if (/*info.handleResult == 0 && */ isISendRequest)
ImageRes.sendRequests.toImage
..width = 20.w
..height = 20.h,
if (info.handleResult == 0 && !isISendRequest)
Button(
text: StrRes.lookOver,
textStyle: Styles.ts_FFFFFF_14sp,
height: 28.h,
padding: EdgeInsets.symmetric(horizontal: 13.w),
onTap: () => logic.handle(info),
),
if (info.handleResult == 0 && isISendRequest)
StrRes.waitingForVerification.toText..style = Styles.ts_8E9AB0_14sp,
if (info.handleResult == -1) StrRes.rejected.toText..style = Styles.ts_8E9AB0_14sp,
if (info.handleResult == 1) StrRes.approved.toText..style = Styles.ts_8E9AB0_14sp,
],
),
);
}
}