parent
4061860309
commit
c55216d90c
@ -0,0 +1,73 @@
|
|||||||
|
import 'package:common_utils/common_utils.dart';
|
||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
|
part 'notice_model.g.dart';
|
||||||
|
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class NoticeModel extends Equatable {
|
||||||
|
final int id;
|
||||||
|
final int type;
|
||||||
|
final int status;
|
||||||
|
final String title;
|
||||||
|
final String content;
|
||||||
|
final String sendDate;
|
||||||
|
final int jumpId;
|
||||||
|
|
||||||
|
DateTime? get sendDateDT => DateUtil.getDateTime(sendDate);
|
||||||
|
|
||||||
|
int? get month => sendDateDT?.month;
|
||||||
|
|
||||||
|
int? get year => sendDateDT?.year;
|
||||||
|
|
||||||
|
factory NoticeModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$NoticeModelFromJson(json);
|
||||||
|
|
||||||
|
const NoticeModel({
|
||||||
|
required this.id,
|
||||||
|
required this.type,
|
||||||
|
required this.status,
|
||||||
|
required this.title,
|
||||||
|
required this.content,
|
||||||
|
required this.sendDate,
|
||||||
|
required this.jumpId,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props =>
|
||||||
|
[id, type, status, title, content, sendDate, jumpId];
|
||||||
|
|
||||||
|
Map<String, dynamic> toMap() {
|
||||||
|
return {
|
||||||
|
'id': this.id,
|
||||||
|
'type': this.type,
|
||||||
|
'status': this.status,
|
||||||
|
'title': this.title,
|
||||||
|
'content': this.content,
|
||||||
|
'sendDate': this.sendDate,
|
||||||
|
'jumpId': this.jumpId,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
NoticeModel copyWith({
|
||||||
|
int? id,
|
||||||
|
int? type,
|
||||||
|
int? status,
|
||||||
|
String? title,
|
||||||
|
String? content,
|
||||||
|
String? sendDate,
|
||||||
|
int? jumpId,
|
||||||
|
}) {
|
||||||
|
return NoticeModel(
|
||||||
|
id: id ?? this.id,
|
||||||
|
type: type ?? this.type,
|
||||||
|
content: content ?? this.content,
|
||||||
|
sendDate: sendDate ?? this.sendDate,
|
||||||
|
status: status ?? this.status,
|
||||||
|
title: title ?? this.title,
|
||||||
|
jumpId: jumpId ?? this.jumpId,
|
||||||
|
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'notice_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
NoticeModel _$NoticeModelFromJson(Map<String, dynamic> json) => NoticeModel(
|
||||||
|
id: ['id'] as int,
|
||||||
|
type: ['type'] as int,
|
||||||
|
status: ['status'] as int,
|
||||||
|
title: ['title'] as String,
|
||||||
|
content: ['content'] as String,
|
||||||
|
sendDate: ['sendDate'] as String,
|
||||||
|
jumpId: ['jumpId'] as int,
|
||||||
|
);
|
@ -0,0 +1,113 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:common_utils/common_utils.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:velocity_x/velocity_x.dart';
|
||||||
|
import '../../../models/message/notice_model.dart';
|
||||||
|
import 'announce_view.dart';
|
||||||
|
|
||||||
|
class AnnounceCard extends StatelessWidget {
|
||||||
|
final ListDateModel modelList;
|
||||||
|
final int index;
|
||||||
|
final bool visible;
|
||||||
|
|
||||||
|
const AnnounceCard({
|
||||||
|
Key? key,
|
||||||
|
required this.modelList,
|
||||||
|
required this.index,
|
||||||
|
required this.visible,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
!visible
|
||||||
|
? SizedBox()
|
||||||
|
: Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
width: double.infinity,
|
||||||
|
height: 98.w,
|
||||||
|
child: '${modelList.year}年${modelList.month}月'
|
||||||
|
.text
|
||||||
|
.size(36.sp)
|
||||||
|
.black
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
...modelList.models
|
||||||
|
.map((e) => _card(e))
|
||||||
|
.toList()
|
||||||
|
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _card(NoticeModel model) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: () {
|
||||||
|
//Get.to(() => NoticeDetailPage(id: model.id));
|
||||||
|
},
|
||||||
|
child: Container(
|
||||||
|
color: Colors.white,
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w, vertical: 24.w),
|
||||||
|
margin: EdgeInsets.only(bottom: 16 .w),
|
||||||
|
child: Column(
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
|
||||||
|
|
||||||
|
'${DateUtil.formatDateStr(model.sendDate, format: 'dd日 HH:mm')}'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.25))
|
||||||
|
.make(),
|
||||||
|
32.w.heightBox,
|
||||||
|
// Container(
|
||||||
|
// width: double.infinity,
|
||||||
|
// height: 258.w,
|
||||||
|
// clipBehavior: Clip.antiAliasWithSaveLayer,
|
||||||
|
// decoration: BoxDecoration(borderRadius: BorderRadius.circular(16.w)),
|
||||||
|
// child: BeeImageNetwork(
|
||||||
|
// imgs: model.imgList,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// 32.w.heightBox,
|
||||||
|
|
||||||
|
'${model.title}'.text.size(36.sp).black.bold.make(),
|
||||||
|
32.w.heightBox,
|
||||||
|
'${model.content}'.text.maxLines(2).ellipsis.size(28.sp).color(Colors.black.withOpacity(0.25)).make(),
|
||||||
|
40.w.heightBox,
|
||||||
|
Container(
|
||||||
|
height: 72.w,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
border: Border(
|
||||||
|
top: BorderSide(
|
||||||
|
color: Color(0xFF000000).withOpacity(0.06),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
'查看详情'.text.size(24.w).color(Colors.black.withOpacity(0.25)).make(),
|
||||||
|
Spacer(),
|
||||||
|
Icon(
|
||||||
|
CupertinoIcons.chevron_right,
|
||||||
|
size: 20.w,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,194 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import 'package:flutter_easyrefresh/easy_refresh.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:scroll_to_index/scroll_to_index.dart';
|
||||||
|
|
||||||
|
import '../../../const/saas_api.dart';
|
||||||
|
import '../../../models/message/notice_model.dart';
|
||||||
|
import '../../../utils/network/net_util.dart';
|
||||||
|
import 'announce_card.dart';
|
||||||
|
|
||||||
|
class ListDateModel {
|
||||||
|
final String month;
|
||||||
|
final int index;
|
||||||
|
final String year;
|
||||||
|
final List<NoticeModel> models;
|
||||||
|
|
||||||
|
ListDateModel(this.month, this.models, this.index, this.year);
|
||||||
|
}
|
||||||
|
|
||||||
|
class AnnounceView extends StatefulWidget {
|
||||||
|
const AnnounceView({
|
||||||
|
Key? key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_AnnounceViewState createState() => _AnnounceViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _AnnounceViewState extends State<AnnounceView> {
|
||||||
|
EasyRefreshController _refreshController = EasyRefreshController();
|
||||||
|
late AutoScrollController _autoScrollController;
|
||||||
|
|
||||||
|
List<ListDateModel> _modelLists = [];
|
||||||
|
List<NoticeModel> _innerModelList = [];
|
||||||
|
String _headMonth = '';
|
||||||
|
|
||||||
|
void monthListDepart(List<NoticeModel> models) {
|
||||||
|
for (var item in models) {
|
||||||
|
var index =
|
||||||
|
_modelLists.indexWhere((element) => element.month == item.month);
|
||||||
|
if (index >= 0) {
|
||||||
|
_modelLists[index].models.add(item.copyWith());
|
||||||
|
} else {
|
||||||
|
_modelLists.insert(
|
||||||
|
_modelLists.length,
|
||||||
|
ListDateModel(item.month.toString(), [item.copyWith()],
|
||||||
|
_modelLists.length, item.year.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int _page = 1;
|
||||||
|
int _size = 5;
|
||||||
|
|
||||||
|
bool visible(int index) {
|
||||||
|
if (index == 0) {
|
||||||
|
return true;
|
||||||
|
} else if (_modelLists[index].month == _modelLists[index - 1].month) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
_autoScrollController = AutoScrollController(
|
||||||
|
viewportBoundaryGetter: () =>
|
||||||
|
Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.top + 130.w),
|
||||||
|
axis: Axis.vertical,
|
||||||
|
);
|
||||||
|
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_refreshController.dispose();
|
||||||
|
_autoScrollController.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Flexible(
|
||||||
|
child: EasyRefresh(
|
||||||
|
firstRefresh: true,
|
||||||
|
header: MaterialHeader(),
|
||||||
|
footer: MaterialFooter(),
|
||||||
|
scrollController: _autoScrollController,
|
||||||
|
controller: _refreshController,
|
||||||
|
onRefresh: () async {
|
||||||
|
_page = 1;
|
||||||
|
_modelLists.clear();
|
||||||
|
_innerModelList.clear();
|
||||||
|
var base =
|
||||||
|
await NetUtil().getList(SAASAPI.message.messageList, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'type': 2,
|
||||||
|
});
|
||||||
|
_innerModelList =
|
||||||
|
base.rows.map((e) => NoticeModel.fromJson(e)).toList();
|
||||||
|
monthListDepart(_innerModelList);
|
||||||
|
if (_modelLists.isNotEmpty) {
|
||||||
|
_headMonth = _modelLists[0].month;
|
||||||
|
}
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
onLoad: () async {
|
||||||
|
_page++;
|
||||||
|
var base =
|
||||||
|
await NetUtil().getList(SAASAPI.message.messageList, params: {
|
||||||
|
'pageNum': _page,
|
||||||
|
'size': _size,
|
||||||
|
'type': 2,
|
||||||
|
});
|
||||||
|
if (base.total > _modelLists.length) {
|
||||||
|
_innerModelList =
|
||||||
|
base.rows.map((e) => NoticeModel.fromJson(e)).toList();
|
||||||
|
monthListDepart(_innerModelList);
|
||||||
|
setState(() {});
|
||||||
|
} else {
|
||||||
|
print('1111111');
|
||||||
|
_refreshController.finishLoadCallBack!(noMore: true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: _modelLists.isEmpty
|
||||||
|
? Container()
|
||||||
|
: ListView.separated(
|
||||||
|
shrinkWrap: true,
|
||||||
|
controller: _autoScrollController,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return AutoScrollTag(
|
||||||
|
key: ValueKey(index),
|
||||||
|
index: index,
|
||||||
|
controller: _autoScrollController,
|
||||||
|
child: AnnounceCard(
|
||||||
|
modelList: _modelLists[index],
|
||||||
|
index: index,
|
||||||
|
visible: visible(index),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
separatorBuilder: (_, index) => SizedBox(),
|
||||||
|
// Container(
|
||||||
|
// padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
// alignment: Alignment.centerLeft,
|
||||||
|
// width: double.infinity,
|
||||||
|
// height: 98.w,
|
||||||
|
// child: _modelLists[index + 1]
|
||||||
|
// .month
|
||||||
|
// .text
|
||||||
|
// .size(36.sp)
|
||||||
|
// .black
|
||||||
|
// .make(),
|
||||||
|
// ),
|
||||||
|
itemCount: _modelLists.length),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
PopupMenuButton _popupMenuButton() {
|
||||||
|
return PopupMenuButton(
|
||||||
|
child: Icon(
|
||||||
|
CupertinoIcons.arrowtriangle_down_fill,
|
||||||
|
size: 24.w,
|
||||||
|
),
|
||||||
|
itemBuilder: (context) {
|
||||||
|
return List.generate(
|
||||||
|
_modelLists.length,
|
||||||
|
(index) => PopupMenuItem(
|
||||||
|
child: Text(_modelLists[index].month),
|
||||||
|
value: _modelLists[index].index,
|
||||||
|
));
|
||||||
|
},
|
||||||
|
onSelected: (value) {
|
||||||
|
_headMonth = _modelLists[value].month;
|
||||||
|
print(value);
|
||||||
|
_autoScrollController.scrollToIndex(value,
|
||||||
|
preferPosition: AutoScrollPosition.end);
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import '../../../style/app_style.dart';
|
||||||
|
import '../../widgets/common/aku_scaffold.dart';
|
||||||
|
import 'announce_view.dart';
|
||||||
|
|
||||||
|
class NoticePage extends StatefulWidget {
|
||||||
|
const NoticePage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_NoticePageState createState() => _NoticePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _NoticePageState extends State<NoticePage> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return AkuScaffold(
|
||||||
|
title: '通知公告',
|
||||||
|
titleStyle: AppStyle().barTitleStyle,
|
||||||
|
body: AnnounceView()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue