news_getx/lib/modules/main/widgets/channels.dart

87 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:news_getx/data/model/channels.dart';
import 'package:news_getx/modules/main/main_controller.dart';
import 'package:news_getx/theme/app_colors.dart';
import 'package:news_getx/theme/app_shadows.dart';
class NewsChannelsWidget extends GetView<MainController> {
Widget _buildChannelItem(ChannelResponse item) {
return Container(
margin: EdgeInsets.symmetric(horizontal: 10),
width: 70.w,
height: 97.h,
child: InkWell(
// 没有水波纹 是有原因的 看splashColor文档 主体splashColor是透明纯黑色 所以不显示
// splashColor: Colors.cyanAccent,
onTap: () {
print(item.title);
},
child: Column(
children: [
// 当 `child` 是图片这种有具体宽高的组件时,
// 如果 `Container` 的宽高只设置期中一个,
// 则另一个的值会根据 `child` 的宽高比例计算得出,
// 如果是大于图片对应的宽高, 则图片原宽高居中显示,
// 此时 `Container` 留有空白.
// https://juejin.cn/post/7016649859008725022#heading-9
Container(
width: 64.w,
height: 64.w,
margin: EdgeInsets.symmetric(horizontal: 3.w),
// 之所以设置padding而不是居中对齐
// 是因为如果设置居中对齐的话展示的是图片本身的大小,而不是我们需要的内边距大小
padding: EdgeInsets.all(10.w),
decoration: BoxDecoration(
color: AppColors.primaryBackground,
boxShadow: [AppShadows.primaryShadow],
borderRadius: BorderRadius.all(Radius.circular(32.w)),
),
child: Image.asset(
"assets/images/channel-${item.code}.png",
fit: BoxFit.cover,
),
),
Padding(
padding: const EdgeInsets.only(top: 12.0),
child: Text(
item.title,
textAlign: TextAlign.center,
overflow: TextOverflow.clip,
maxLines: 1,
style: TextStyle(
color: AppColors.thirdElementText,
fontFamily: "Avenir",
fontWeight: FontWeight.w400,
fontSize: 14.sp,
height: 14.sp / 14,
),
),
),
],
),
),
);
}
@override
Widget build(BuildContext context) {
return Obx(
() => controller.state.channels == null
? Container()
: Container(
height: 137.h,
child: SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: controller.state.channels!.map<Widget>((item) {
return _buildChannelItem(item);
}).toList(),
),
),
),
);
}
}