Flutter横幅列表展示插件banner_listtile的使用

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

Flutter横幅列表展示插件banner_listtile的使用

Banner Listtile

pub License

Banner_Listtile 插件在您需要一个带有内置横幅选项的瓷砖模板时非常有用。您可能见过带有标签(如“New”,“Hot”,“New Collection”等)的横幅,Banner_listtile 正是实现了这样的效果,并且您可以轻松自定义它。

安装

  1. 将最新版本的此软件包添加到您的 pubspec.yaml 文件中,并运行 'dart pub get'
dependancies:
  banner_listtile: ^2.3.0
  1. 在Flutter应用程序中导入并使用该软件包:
import 'package:banner_listtile/banner_listtile.dart';

更新日志

New 2.3.0 Changes

  • ✅ 添加了 Position 枚举。现在不是布尔值,而是需要 Position 枚举作为其值。
  • 🔀 现在可以在横幅上添加图标而不是文本。
  • 🚫 移除了 RandomColor 属性。
  • ✨ 修复了UI出血问题,使锯齿形图像侧看起来更平滑和锐利。

注意事项

如果您在 ColumnListview 或任何垂直列表内使用它,则不需要为其提供高度属性。但是,当您将其用作单个小部件或嵌套在其他小部件中时,建议您通过给它一个高度属性来定义其高度。如果不这样做,它可能会占用所有可用空间。

示例代码

下面是一个简单的示例,演示如何在Flutter应用中使用 BannerListTile

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

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: BannerListTile(
          backgroundColor: Colors.blue,
          borderRadius: BorderRadius.circular(8),
          bannerPosition: BannerPosition.topRight,
          imageContainer: Image(
              image: NetworkImage(
                  "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb1.2.1&auto=format&fit=crop&w=387&q=80"),
              fit: BoxFit.cover),
          title: Text(
            "Lisa",
            style: TextStyle(fontSize: 24, color: Colors.white),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
          ),
          subtitle: Text("A model from NY",
              style: TextStyle(fontSize: 13, color: Colors.white)),
          trailing: IconButton(
              onPressed: () {},
              icon: Icon(
                Icons.delete_forever,
                color: Colors.red,
              )),
        ),
      ),
    );
  }
}

更多示例:(添加文本或图标)

新的锯齿形状

BannerListTile(
    imageContainerShapeZigzagIndex: index, // [index = (even or odd integer number)]
),

更多示例

即将推出

如果需要,会添加更多功能。欢迎为这个包做贡献,可以去github仓库fork并提交pull request。

如果有任何建议或错误报告,请发送邮件至:eaglex129@gmail[dot]com

完整示例Demo

以下是包含 BannerListTile 的完整示例demo:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData.light(),
      home: const ContainerTestView(),
    );
  }
}

class ContainerTestView extends StatefulWidget {
  const ContainerTestView({Key? key}) : super(key: key);

  @override
  State<ContainerTestView> createState() => _ContainerTestViewState();
}

class _ContainerTestViewState extends State<ContainerTestView> {
  int _selectedIndex = 0;

  static final List<Widget> _pages = <Widget>[
    ListViewScreen(),
    CustomScreen(),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text("Banner Listtile"),
      ),
      body: _pages.elementAt(_selectedIndex),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _selectedIndex,
        onTap: _onItemTapped,
        items: const <BottomNavigationBarItem>[
          BottomNavigationBarItem(
            icon: Icon(Icons.menu),
            label: 'List',
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.dashboard_customize),
            label: 'Custom',
          ),
        ],
      ),
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: 10,
      itemBuilder: (context, index) {
        return BannerListTile(
          backgroundColor: Colors.blue,
          borderRadius: BorderRadius.circular(8),
          bannerPosition: BannerPosition.topRight,
          imageContainer: Image.network(
            "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb1.2.1&auto=format&fit=crop&w=387&q=80",
            fit: BoxFit.cover,
          ),
          title: Text(
            "Title $index",
            style: TextStyle(fontSize: 24, color: Colors.white),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
          ),
          subtitle: Text("Subtitle $index",
              style: TextStyle(fontSize: 13, color: Colors.white)),
          trailing: IconButton(
              onPressed: () {},
              icon: Icon(
                Icons.delete_forever,
                color: Colors.red,
              )),
        );
      },
    );
  }
}

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

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        BannerListTile(
          backgroundColor: Colors.green,
          borderRadius: BorderRadius.circular(8),
          bannerPosition: BannerPosition.topLeft,
          imageContainer: Image.network(
            "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb1.2.1&auto=format&fit=crop&w=387&q=80",
            fit: BoxFit.cover,
          ),
          title: Text(
            "Custom Title",
            style: TextStyle(fontSize: 24, color: Colors.white),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
          ),
          subtitle: Text("Custom Subtitle",
              style: TextStyle(fontSize: 13, color: Colors.white)),
          trailing: IconButton(
              onPressed: () {},
              icon: Icon(
                Icons.edit,
                color: Colors.orange,
              )),
        ),
        SizedBox(height: 20),
        BannerListTile(
          backgroundColor: Colors.purple,
          borderRadius: BorderRadius.circular(8),
          bannerPosition: BannerPosition.bottomLeft,
          imageContainer: Image.network(
            "https://images.unsplash.com/photo-1529626455594-4ff0802cfb7e?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb1.2.1&auto=format&fit=crop&w=387&q=80",
            fit: BoxFit.cover,
          ),
          title: Text(
            "Another Title",
            style: TextStyle(fontSize: 24, color: Colors.white),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
          ),
          subtitle: Text("Another Subtitle",
              style: TextStyle(fontSize: 13, color: Colors.white)),
          trailing: IconButton(
              onPressed: () {},
              icon: Icon(
                Icons.favorite,
                color: Colors.pink,
              )),
        ),
      ],
    );
  }
}

以上代码展示了如何在一个完整的Flutter应用中使用 BannerListTile。包括创建一个包含 ListView 和自定义布局的页面,并在这些页面中使用 BannerListTile。希望这对您有所帮助!


更多关于Flutter横幅列表展示插件banner_listtile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter横幅列表展示插件banner_listtile的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用banner_listtile插件来展示横幅列表的一个简单示例。假设你已经在你的pubspec.yaml文件中添加了banner_listtile依赖并运行了flutter pub get

首先,确保你的pubspec.yaml文件包含以下依赖:

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

然后,你可以按照以下步骤在你的Flutter应用中实现横幅列表展示。

  1. 导入必要的包

在你的Dart文件中(例如main.dart),导入banner_listtile包:

import 'package:flutter/material.dart';
import 'package:banner_listtile/banner_listtile.dart';
  1. 创建横幅列表数据

定义一个包含横幅数据的列表。每个横幅项可以包含标题、描述和图片URL等信息。

List<Map<String, dynamic>> bannerData = [
  {
    'title': '横幅1',
    'description': '这是横幅1的描述',
    'imageUrl': 'https://example.com/banner1.jpg',
  },
  {
    'title': '横幅2',
    'description': '这是横幅2的描述',
    'imageUrl': 'https://example.com/banner2.jpg',
  },
  // 可以添加更多横幅数据
];
  1. 构建横幅列表

使用BannerListTile组件来展示横幅列表。

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('横幅列表展示'),
        ),
        body: Center(
          child: BannerListTile.builder(
            itemCount: bannerData.length,
            itemBuilder: (context, index) {
              Map<String, dynamic> item = bannerData[index];
              return BannerListTile(
                title: Text(item['title']),
                subTitle: Text(item['description']),
                image: NetworkImage(item['imageUrl']),
                onTap: () {
                  // 点击横幅时的处理逻辑
                  print('点击了横幅: ${item['title']}');
                },
              );
            },
          ),
        ),
      ),
    );
  }
}

在这个例子中,BannerListTile.builder方法用于构建横幅列表。itemCount指定了横幅的总数,itemBuilder是一个回调函数,用于构建每个横幅项。

BannerListTile组件接受以下参数:

  • title:横幅的标题,通常是一个Text组件。
  • subTitle:横幅的描述,也是一个Text组件。
  • image:横幅的图片,这里使用了NetworkImage(来自banner_listtile包),你也可以使用其他图片组件如Image.network
  • onTap:点击横幅时的回调函数。

请注意,NetworkImagebanner_listtile包中提供的一个便捷组件,用于从网络加载图片。如果你使用的是标准Flutter组件,可以使用Image.network代替。

以上代码展示了如何使用banner_listtile插件来创建一个简单的横幅列表展示。你可以根据需要进行自定义和扩展。

回到顶部