2026-07-01 18:25:58 +08:00

133 lines
4.2 KiB
Dart

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:pull_to_refresh/pull_to_refresh.dart';
import '../../../../app_localizations.dart';
import '../../../../chatvibe_core/utilities/at_banner_utils.dart';
import '../../../../chatvibe_core/utilities/at_loading_manager.dart';
import '../../../../chatvibe_data/models/enum/at_banner_type.dart';
import '../../../../chatvibe_data/sources/repositories/config_repository_imp.dart';
import '../../../../chatvibe_domain/models/res/at_index_banner_res.dart';
import '../../../../chatvibe_ui/components/at_compontent.dart';
class HomeEventPage extends StatefulWidget {
@override
_HomeEventPageState createState() => _HomeEventPageState();
}
class _HomeEventPageState extends State<HomeEventPage>
with SingleTickerProviderStateMixin {
bool isLoading = false;
List<ATIndexBannerRes> homeBanners = [];
final RefreshController _refreshController = RefreshController(
initialRefresh: false,
);
@override
void initState() {
super.initState();
_loadData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: Colors.transparent,
body: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: [
SmartRefresher(
enablePullDown: true,
enablePullUp: false,
controller: _refreshController,
onRefresh: () {
_loadData();
},
onLoading: () {},
child:
homeBanners.isNotEmpty
? SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [_banner()],
),
)
: GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
_loadData();
},
child:
isLoading
? Center(child: CupertinoActivityIndicator())
: mainEmpty(
msg: ATAppLocalizations.of(context)!.noData,
),
),
),
],
),
);
}
_banner() {
return homeBanners.isNotEmpty
? Container(
margin: EdgeInsets.symmetric(horizontal: 10.w),
child: ListView.separated(
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemCount: homeBanners.length,
// 列表项数量
padding: EdgeInsets.only(bottom: 15.w),
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
print('ads:${homeBanners[index].toJson()}');
ATBannerUtils.openBanner(homeBanners[index], context);
},
child: netImage(
height: 98.w,
url: homeBanners[index].cover ?? "",
fit: BoxFit.contain,
borderRadius: BorderRadius.all(Radius.circular(12.w)),
),
);
},
separatorBuilder: (BuildContext context, int index) {
return SizedBox(height: 10.w);
},
),
)
: Container();
}
_loadData() async {
setState(() {
isLoading = true;
});
ATLoadingManager.exhibitOperation();
try {
var banners = await ConfigRepositoryImp().getBanner();
homeBanners.clear();
for (var v in banners) {
if ((v.displayPosition ?? "").contains(ATBannerType.HOME_ALERT.name)) {
homeBanners.add(v);
}
}
_refreshController.refreshCompleted();
_refreshController.loadComplete();
isLoading = false;
if (mounted) setState(() {});
ATLoadingManager.veilRoutine();
} catch (e) {
_refreshController.refreshCompleted();
_refreshController.loadComplete();
isLoading = false;
if (mounted) setState(() {});
ATLoadingManager.veilRoutine();
}
}
}