import 'package:PiliPlus/common/widgets/loading_widget.dart'; import 'package:PiliPlus/common/widgets/refresh_indicator.dart'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:PiliPlus/common/widgets/network_img_layer.dart'; import '../../../utils/app_scheme.dart'; import 'controller.dart'; class ReplyMePage extends StatefulWidget { const ReplyMePage({super.key}); @override State createState() => _ReplyMePageState(); } class _ReplyMePageState extends State { late final _replyMeController = Get.put(ReplyMeController()); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text('回复我的')), body: refreshIndicator( onRefresh: () async { await _replyMeController.onRefresh(); }, child: Obx(() => _buildBody(_replyMeController.loadingState.value)), ), ); } Widget _buildBody(LoadingState loadingState) { return switch (loadingState) { Loading() => loadingWidget, Success() => (loadingState.response as List?)?.isNotEmpty == true ? ListView.separated( itemCount: loadingState.response.length, physics: const AlwaysScrollableScrollPhysics(), padding: EdgeInsets.only( bottom: MediaQuery.paddingOf(context).bottom + 80), itemBuilder: (context, int index) { if (index == loadingState.response.length - 1) { _replyMeController.onLoadMore(); } return ListTile( onTap: () { String? nativeUri = loadingState.response[index].item?.nativeUri; if (nativeUri != null) { PiliScheme.routePushFromUrl(nativeUri); } }, leading: GestureDetector( onTap: () { Get.toNamed( '/member?mid=${loadingState.response[index].user?.mid}'); }, child: NetworkImgLayer( width: 45, height: 45, type: 'avatar', src: loadingState.response[index].user?.avatar, ), ), title: Text( "${loadingState.response[index].user?.nickname} " "回复了我的${loadingState.response[index].item?.business}", style: Theme.of(context) .textTheme .bodyMedium! .copyWith(color: Theme.of(context).colorScheme.primary), ), subtitle: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ const SizedBox(height: 4), Text( loadingState.response[index].item?.sourceContent ?? "", style: Theme.of(context).textTheme.bodyMedium), const SizedBox(height: 4), if (loadingState .response[index].item?.targetReplyContent != null && loadingState .response[index].item?.targetReplyContent != "") Text( "| ${loadingState.response[index].item?.targetReplyContent}", maxLines: 1, overflow: TextOverflow.ellipsis, style: Theme.of(context) .textTheme .labelMedium! .copyWith( color: Theme.of(context).colorScheme.outline, height: 1.5)), if (loadingState.response[index].item?.rootReplyContent != null && loadingState.response[index].item?.rootReplyContent != "") Text( " | ${loadingState.response[index].item?.rootReplyContent}", maxLines: 1, overflow: TextOverflow.ellipsis, style: Theme.of(context) .textTheme .labelMedium! .copyWith( color: Theme.of(context).colorScheme.outline, height: 1.5)), Text( Utils.dateFormat( loadingState.response[index].replyTime), style: Theme.of(context).textTheme.bodyMedium!.copyWith( color: Theme.of(context).colorScheme.outline, ), ), ], ), ); }, separatorBuilder: (BuildContext context, int index) { return Divider( indent: 72, endIndent: 20, height: 6, color: Colors.grey.withOpacity(0.1), ); }, ) : scrollErrorWidget(callback: _replyMeController.onReload), Error() => scrollErrorWidget( errMsg: loadingState.errMsg, callback: _replyMeController.onReload, ), LoadingState() => throw UnimplementedError(), }; } }