Flutter轮播标题插件title_carousel的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter轮播标题插件title_carousel的使用

简介

title_carousel 是一个Flutter插件,用于创建带有轮播图像的组件。它可以使用网络或本地图片来实现多张图片的循环展示,并且可以为图片添加文本覆盖,根据图片的亮度自动调整文本颜色。

安装

要在项目中使用 title_carousel,首先需要在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  title_carousel: any

然后在 Dart 文件中导入该包:

import 'package:title_carousel/title_carousel.dart';

使用方法

基本用法

要添加一个 TitleCarousel 到你的项目中,可以在 widget 树中像使用其他 widget 一样使用它,并通过 CarouselImage 类提供图片。

TitleCarousel(
  images: [
    CarouselImage(image: "https://source.unsplash.com/b027q9eF3Yo.jpeg"),
    CarouselImage(image: "https://source.unsplash.com/6L-b2EmQ4gk.jpeg"),
    CarouselImage(image: "https://source.unsplash.com/6L-b2EmQ4gk.jpeg")
  ]
)

这将创建一个简单的轮播图,包含3张图片,图片会循环切换。

添加文本覆盖

你可以通过传递 TextProperties 类来为图片添加文本覆盖。TextProperties 类允许你根据图片的亮度自动调整文本颜色。

CarouselImage(
  image: "https://source.unsplash.com/b027q9eF3Yo.jpeg",
  titleOverlay: TextProperties(title: "Swan\n", computeLuminance: true),
  childrenTextOverlay: [
    TextProperties("An elegant swan swimming in the lake", computeLuminance: true)
  ]
)
  • computeLuminance: true:启用根据图片亮度计算文本颜色的功能。
  • brightColordarkColor:可以自定义亮色和暗色文本的颜色。
  • TextProperties 类还包含与 Text 组件相同的属性,因此你可以根据需要自定义文本样式。
自定义指示点

TitleCarousel 提供了 dotDecoration 参数,允许你自定义轮播图下方的指示点样式。你可以更改指示点的颜色、大小等属性。

TitleCarousel(
  images: [
    // 图片列表
  ],
  dotDecoration: DotDecoration(
    color: Colors.grey,          // 未选中的指示点颜色
    selectedColor: Colors.blue,  // 选中的指示点颜色
    size: Size(10, 10),          // 指示点大小
    selectedSize: Size(12, 12)   // 选中的指示点大小
  )
)
获取当前显示的图片

你可以通过给 TitleCarousel 分配一个 GlobalKey 来获取当前显示的图片。

GlobalKey<TitleCarouselState> carouselKey = GlobalKey();

// 在 widget 树中使用
TitleCarousel(key: carouselKey)

// 获取当前显示的图片
String getCurrentImage() {
  CarouselImage image = carouselKey.currentState?.getCurrentImage();
  return image?.image ?? '';
}

示例代码

以下是一个完整的示例代码,展示了如何在项目中使用 title_carousel 插件。这个示例包括两个页面:一个是不使用亮度计算的轮播图,另一个是使用亮度计算的轮播图。

import 'package:flutter/material.dart';
import 'package:title_carousel/title_carousel.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Title Carousel Example',
      home: Home(),
    );
  }
}

class Home extends StatelessWidget {
  const Home({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Title Carousel Example'),
      ),
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: [
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => NonLuminanceExample()),
                );
              },
              child: Text("Non Luminance Example"),
            ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => LuminanceExample()),
                );
              },
              child: Text("Luminance Example"),
            ),
          ],
        ),
      ),
    );
  }
}

class NonLuminanceExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Non Luminance Example'),
      ),
      body: Center(
        child: TitleCarousel(
          images: [
            CarouselImage(image: "https://source.unsplash.com/b027q9eF3Yo.jpeg"),
            CarouselImage(image: "https://source.unsplash.com/6L-b2EmQ4gk.jpeg"),
            CarouselImage(image: "https://source.unsplash.com/6L-b2EmQ4gk.jpeg")
          ],
          dotDecoration: DotDecoration(
            color: Colors.grey,
            selectedColor: Colors.blue,
            size: Size(10, 10),
            selectedSize: Size(12, 12),
          ),
        ),
      ),
    );
  }
}

class LuminanceExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Luminance Example'),
      ),
      body: Center(
        child: TitleCarousel(
          images: [
            CarouselImage(
              image: "https://source.unsplash.com/b027q9eF3Yo.jpeg",
              titleOverlay: TextProperties(title: "Swan\n", computeLuminance: true),
              childrenTextOverlay: [
                TextProperties("An elegant swan swimming in the lake", computeLuminance: true)
              ],
            ),
            CarouselImage(
              image: "https://source.unsplash.com/6L-b2EmQ4gk.jpeg",
              titleOverlay: TextProperties(title: "Lake\n", computeLuminance: true),
              childrenTextOverlay: [
                TextProperties("A beautiful lake surrounded by mountains", computeLuminance: true)
              ],
            ),
          ],
          dotDecoration: DotDecoration(
            color: Colors.grey,
            selectedColor: Colors.blue,
            size: Size(10, 10),
            selectedSize: Size(12, 12),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter轮播标题插件title_carousel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter轮播标题插件title_carousel的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用title_carousel插件来实现轮播标题的一个示例代码。首先,你需要确保你的Flutter项目中已经添加了title_carousel依赖。你可以在pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  title_carousel: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

下面是一个简单的示例代码,展示如何使用title_carousel插件:

import 'package:flutter/material.dart';
import 'package:title_carousel/title_carousel.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  // 定义轮播标题的数据
  final List<String> titles = [
    '标题 1',
    '标题 2',
    '标题 3',
    '标题 4',
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter 轮播标题示例'),
      ),
      body: Center(
        child: TitleCarousel(
          // 传递标题数据
          titles: titles,
          // 设置轮播间隔时间(毫秒)
          autoPlayInterval: 3000,
          // 设置标题样式
          titleStyle: TextStyle(
            fontSize: 24,
            fontWeight: FontWeight.bold,
            color: Colors.black,
          ),
          // 设置指示器样式
          indicatorStyle: IndicatorStyle(
            activeColor: Colors.blue,
            inactiveColor: Colors.grey,
            indicatorSize: 8,
            indicatorSpacing: 8,
          ),
          // 设置动画曲线
          animationCurve: Curves.easeInOutQuad,
          // 设置轮播方向
          scrollAxis: Axis.horizontal,
          // 设置是否循环播放
          loop: true,
          // 设置轮播项高度(如果需要垂直轮播)
          itemHeight: 50,
          // 设置轮播完成后回调
          onPageChanged: (index) {
            print('当前轮播到标题: ${titles[index]}');
          },
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个TitleCarousel组件。我们传递了一个包含标题的列表给titles属性,并设置了其他几个可选属性来自定义轮播的行为和样式。

  • autoPlayInterval:自动播放间隔时间,单位为毫秒。
  • titleStyle:标题的文本样式。
  • indicatorStyle:指示器的样式,包括活动和非活动颜色、指示器大小和间距。
  • animationCurve:动画曲线,决定了轮播动画的速度变化。
  • scrollAxis:轮播方向,可以是水平(Axis.horizontal)或垂直(Axis.vertical)。
  • loop:是否循环播放。
  • itemHeight:轮播项的高度(仅当scrollAxis为垂直时有效)。
  • onPageChanged:轮播完成时回调,返回当前轮播到的索引。

你可以根据需要调整这些属性来满足你的具体需求。希望这个示例能帮助你更好地理解和使用title_carousel插件。

回到顶部