import 'package:flutter/material.dart'; import 'package:get/get.dart'; import '../constants.dart'; import '../utils/api.dart'; import '../utils/http_utils.dart'; import '../utils/size_fit.dart'; import 'component/top_container.dart'; class History extends StatefulWidget { const History({Key? key}) : super(key: key); @override State createState() => _HistoryState(); } class _HistoryState extends State { List histories = []; @override void initState() { // TODO: implement initState getDatas(); super.initState(); } Future getDatas() async { var data = await HttpUtils.get(Api.history); setState(() { histories = data['data']; }); } @override Widget build(BuildContext context) { SizeFit.initialize(context); return Material( color: kBgColor, child: TopContainer( child: Stack(children: [ SingleChildScrollView( child: Column( children: [ ...List.generate(histories.length, (index) { return HistoryItem(data: histories[index]); }) ], ), ) ]))); } } class HistoryItem extends StatefulWidget { var data; HistoryItem({Key? key, required this.data}) : super(key: key); @override State createState() => _HistoryItemState(); } class _HistoryItemState extends State with SingleTickerProviderStateMixin { double scale = 1.0; late AnimationController controller; late Animation animation; @override void initState() { controller = AnimationController( vsync: this, duration: const Duration(milliseconds: 100)); animation = Tween(begin: 0.0, end: 1.0) .animate(CurvedAnimation(parent: controller, curve: Curves.easeOut)); controller.addListener(() { setState(() {}); }); super.initState(); } @override void dispose() { controller.dispose(); super.dispose(); } formatTime(DateTime dateTime) { DateTime now = DateTime.now(); int minutes = (now.millisecondsSinceEpoch ~/ 1000 - dateTime.millisecondsSinceEpoch ~/ 1000) ~/ 60; if (minutes < 1) { return '刚刚'; } else if (minutes <= 59) { return minutes.toString() + '分钟前'; } else if (minutes <= 60 * 24 - 1) { return (minutes ~/ 60).toString() + '小时前'; } else if (minutes <= 60 * 24 * 3 - 1) { return (minutes ~/ (60 * 24)).toString() + '天前'; } return dateTime.year.toString() + '-' + dateTime.month.toString().padLeft(2, "0") + '-' + dateTime.day.toString().padLeft(2, "0"); } @override Widget build(BuildContext context) { return GestureDetector( onTap: () { Get.toNamed('/',parameters: {'u':widget.data['url']}); }, onTapDown: (TapDownDetails details) { controller.forward(); }, onTapUp: (TapUpDetails details) { controller.reverse(); }, onTapCancel: () { controller.reverse(); }, child: Transform.scale( scale: 1 - 0.05 * animation.value, child: Container( width: 343.px, margin: EdgeInsets.only(top: 8.px), padding: EdgeInsets.fromLTRB(20.px, 18.px, 12.px, 18.px), decoration: BoxDecoration( color: const Color(0xFF262626), borderRadius: BorderRadius.circular(24.px)), child: Row( children: [ ClipRRect( borderRadius: BorderRadius.circular(24.px), child: Image.network( widget.data['avatar'], width: 48.px, height: 48.px, fit: BoxFit.cover, ), ), SizedBox(width: 12.px), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.data['nickname'], style: TextStyle( color: Colors.white, fontSize: 16.px, fontWeight: FontWeight.bold), ), SizedBox( height: 4.px, ), Text( formatTime(DateTime.fromMillisecondsSinceEpoch(widget.data['time'])), style: TextStyle( color: const Color(0xFF74747A), fontSize: 12.px), ), ], )), Image.asset( 'assets/images/arrow_right.png', width: 20.px, height: 20.px, ) ], ), ), )); } }