[Day05] Flutter with GetX carousel slider 水平轮播

Carousel slider

轮播动画 原生要处理的话印象中是PageView

先建立一个widget class, 将package的封装一次
construct传入将要显示的资料与点击事件回传

import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart';
import 'dart:math';

class CarouselSlide extends StatelessWidget {
  CarouselSlide({Key? key, required this.dataList, required this.didSelected})
      : super(key: key);
  final List dataList;
  final Function(int index) didSelected;

  @override
  Widget build(BuildContext context) {
    return CarouselSlider(
      options: CarouselOptions(
        height: MediaQuery.of(context).size.width * 0.86 * 9 / 16,
        aspectRatio: 16 / 9,
        enableInfiniteScroll: true,
        autoPlay: true,
        autoPlayInterval: const Duration(seconds: 2),
      ),
      items: dataList.map((element) {
        final index = dataList.indexOf(element);
        return GestureDetector(
          onTap: () => didSelected(index),
          child: Container(
            margin: EdgeInsets.symmetric(horizontal: 5.0),
            decoration: BoxDecoration(color: Colors.transparent),
            child: Stack(
              alignment: Alignment.center,
              children: [
                ClipRRect(
                  borderRadius: BorderRadius.circular(10),
                  child: Container(
                      color: Colors.primaries[
                          Random().nextInt(Colors.primaries.length)]),
                ),
                Positioned(
                  child: Text(
                    "$index",
                    style: TextStyle(fontSize: 30, color: Colors.white),
                  ),
                ),
              ],
            ),
          ),
        );
      }).toList(),
    );
  }
}

CarouselOptions内的属性设定 
autoPlay:
是否自动换下一张, autoPlayInterval:换下一张间格几秒
enableInfiniteScroll:
是否无限轮播,scrollDirection: 滑动方向(预设水平方向)

实际使用的页面, 呼叫刚封装的class

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:it_home/component/CarouselSlide.dart';
import 'package:it_home/pages/carousel_slider/CarouselSlidePageController.dart';

class CarouselSlidePage extends GetView<CarouselSlidePageController> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('SliderListPage')),
      body: SafeArea(
        child: Center(
          child: CarouselSlide(
            dataList: controller.dataList,
            didSelected: (int index) {
              print("didTapped $index");
            },
          ),
        ),
      ),
    );
  }
}

因为有用到GetxController这边也把程序码一并放在这边
生成一个List用於资料显示

import 'package:get/get.dart';

class CarouselSlidePageController extends GetxController {
  final _dataList = [].obs;
  get dataList => this._dataList;

  @override
  void onInit() {
    _dataList.assignAll(Iterable<int>.generate(10).toList());
    super.onInit();
  }
}

最後画面如下
https://miro.medium.com/max/404/1*Ma6vOhPJE9BV9C8jtUJ0EA.gif

本篇的GitHub source code

下一篇将为大家介绍shared preferences


<<:  Day4 SCADA 资料采集与监控系统 (Supervisory Control And Data Acquisition)

>>:  DAY4:Kaggle-Data Science London + Scikit-learn(一)

GoLang 语言

https://wolkesau.medium.com/golang-语言-d86e8a781fb3...

30天学习笔记 介绍-day 25-View Animation

View Animation可以对view做透明度、缩放、平移、旋转等动画。 xml动画文件需再re...

Day 29 - 这一年多来的开发问题解析心得分享

今天讨论的主题是关於开发的过程中,问题要怎麽去思考和解决的小技巧,这些内容对於刚开始学习程序或者是新...

[序章] 自然语言处理初探

前言 生活在网际网路以及智慧型手机普及的今天,与外国朋友聊天、出国旅行、与国外客户开商务会议,纵使不...

Day19 网页的页首header

今天我们就要着手开始实作拉!而造顺序来的话我们最上方都会有个logo跟导览列,接下来就让我们把学过的...