Flutter水平列表展示插件horizontal_list_view的使用

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

Flutter水平列表展示插件horizontal_list_view的使用

horizontal_list_view 是一个简单且可定制的水平列表视图小部件,用于以水平布局显示项目列表。该软件包旨在简化具有指定 crossAxisCount 的水平列表的创建,而无需为 ListView 提供固定的高度。

Preview example

安装

在你的 pubspec.yaml 文件中添加依赖:

dependencies:
  horizontal_list_view: ^1.1.0

然后导入:

import 'package:horizontal_list_view/horizontal_list_view.dart';

使用方法

使用 HorizontalListView

以下是一个简单的 HorizontalListView 示例:

HorizontalListView(
  crossAxisCount: 2, // 每行显示的项目数
  crossAxisSpacing: 8.0, // 同一行内项目的间距
  alignment: CrossAxisAlignment.center, // 行内项目的对齐方式(默认居中)
  controller: HorizontalListViewController(), // 可选滚动控制器
  children: [
    // 子组件列表
    Container(color: Colors.red, child: Text('Item 1')),
    Container(color: Colors.green, child: Text('Item 2')),
    Container(color: Colors.blue, child: Text('Item 3')),
    // ...
  ],
)

使用 HorizontalListView.builder

如果你想要创建一个带有动态内容的水平列表视图,可以使用 HorizontalListView.builder。以下是一个示例:

HorizontalListView.builder(
  crossAxisCount: 3, // 每行显示的项目数
  crossAxisSpacing: 16, // 同一行内项目的间距
  alignment: CrossAxisAlignment.center, // 行内项目的对齐方式(默认居中)
  controller: HorizontalListViewController(), // 可选滚动控制器
  itemCount: 12, // 列表中的总项目数
  itemBuilder: (BuildContext context, int index) {
    return AspectRatio(
      aspectRatio: 16 / 9, // 设置宽高比
      child: Container(
        color: Colors.red,
        child: Center(
          child: Text('item: $index'),
        ),
      ),
    );
  },
)

在这个例子中,你可以指定每行的项目数 (crossAxisCount)、项目之间的间距 (crossAxisSpacing),并提供一个 itemBuilder 函数来根据索引创建各个项目的小部件。

完整示例 Demo

下面是一个完整的示例代码,展示了如何在一个 Flutter 应用中使用 horizontal_list_view 插件:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Horizontal List View Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final HorizontalListViewController _controller = HorizontalListViewController();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: SingleChildScrollView(
          padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 32.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              HorizontalListView.builder(
                crossAxisCount: 3,
                crossAxisSpacing: 16,
                controller: _controller,
                itemCount: 25,
                itemBuilder: (BuildContext context, int index) {
                  return AspectRatio(
                    aspectRatio: 2 / 3,
                    child: Container(
                      color: Colors.orange,
                      child: Center(
                        child: Text(
                          'item: $index',
                          style: const TextStyle(
                            color: Colors.white,
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                      ),
                    ),
                  );
                },
              ),
              const SizedBox(height: 32.0),
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  IconButton.filled(
                    onPressed: () {
                      if (_controller.currentPage > 0) {
                        _controller.animateToPage(
                          _controller.currentPage - 1,
                          duration: const Duration(milliseconds: 500),
                          curve: Curves.linearToEaseOut,
                        );
                      }
                    },
                    icon: const Icon(Icons.chevron_left),
                  ),
                  const SizedBox(width: 32),
                  IconButton.filled(
                    onPressed: () {
                      _controller.animateToPage(
                        _controller.currentPage + 1,
                        duration: const Duration(milliseconds: 500),
                        curve: Curves.linearToEaseOut,
                      );
                    },
                    icon: const Icon(Icons.chevron_right),
                  )
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

此示例代码创建了一个包含水平滚动列表的应用程序,并提供了左右翻页按钮来控制列表的滚动。希望这个示例能帮助你更好地理解和使用 horizontal_list_view 插件!


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

1 回复

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


当然,以下是如何在Flutter应用中使用horizontal_list_view(虽然Flutter原生已经提供了ListView.builder来实现水平列表,但假设这里提到的horizontal_list_view是一个自定义的或第三方插件,这里我将展示一个类似功能的实现,因为直接名为horizontal_list_view的官方插件并不存在)。

通常,在Flutter中展示水平列表,你可以使用ListView.builder并设置scrollDirectionAxis.horizontal。下面是一个基本的实现示例:

import 'package:flutter/material.dart';

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

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

class MyHomePage extends StatelessWidget {
  final List<String> items = List<String>.generate(20, (i) => "Item $i");

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Horizontal ListView Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(8.0),
        child: ListView.builder(
          scrollDirection: Axis.horizontal,
          itemCount: items.length,
          itemBuilder: (BuildContext context, int index) {
            return Padding(
              padding: const EdgeInsets.symmetric(horizontal: 8.0),
              child: Card(
                child: Container(
                  width: 100,
                  height: 100,
                  alignment: Alignment.center,
                  child: Text(
                    items[index],
                    style: TextStyle(fontSize: 18),
                  ),
                ),
              ),
            );
          },
        ),
      ),
    );
  }
}

解释

  1. ListView.builder:

    • scrollDirection: Axis.horizontal:设置滚动方向为水平。
    • itemCount: items.length:列表项的数量。
    • itemBuilder:构建每个列表项的回调函数。
  2. PaddingCard:

    • 用于给每个列表项添加一些间距和装饰,使列表看起来更美观。
  3. 数据生成

    • List<String>.generate(20, (i) => "Item $i"):生成一个包含20个字符串的列表,每个字符串格式为"Item 0", “Item 1”, …, “Item 19”。

如果你确实有一个名为horizontal_list_view的第三方插件,并且它提供了不同于ListView.builder的API,请查阅该插件的文档以获取具体的使用方法。不过,大多数水平列表的插件都会提供类似的功能,只是API可能稍有不同。在那种情况下,你可以根据插件的文档调整上述代码。

回到顶部