| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- 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<History> createState() => _HistoryState();
- }
- class _HistoryState extends State<History> {
- 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<Widget>.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<HistoryItem> createState() => _HistoryItemState();
- }
- class _HistoryItemState extends State<HistoryItem>
- 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,
- )
- ],
- ),
- ),
- ));
- }
- }
|