七爪源码:在 Flutter 中使用 PageView Builder 构建折叠滚动

七爪源码:在 Flutter 中使用 PageView Builder 构建折叠滚动

在本文中,我们将创建一个类似于 LOUIS VUITTON 移动应用程序的列表视图的水平滚动。

最终应用程序的工作原理如下:

七爪源码:在 Flutter 中使用 PageView Builder 构建折叠滚动

在深入研究编码之前,让我们讨论将在此应用程序中使用的小部件。


页面预览

PageView 是一个小部件,它生成可滚动的屏幕页面。 这些页面可以是由构建器功能构建的固定页面或重复页面。

PageView 在构造元素时的行为类似于 ListView。 PageView 还允许用户在 Flutter 应用程序中的不同屏幕之间切换。


PageView 类的构造函数

PageView({Key key, 
Axis scrollDirection, 
bool reverse, 
PageController controller, 
ScrollPhysics physics, 
bool pageSnapping, 
void Function(int) onPageChanged, 
List children, 
DragStartBehavior dragStartBehavior, 
bool allowImplicitScrolling})


PageView 小部件的属性:


PageView.builder

PageView.builder 创建一个可滚动列表,该列表使用按需创建的小部件逐页工作。

此构造函数适用于具有大量(或无限)子级的页面视图,因为仅对那些实际可见的子级调用构建器。

提供非空 itemCount 让 PageView 计算最大滚动范围。


PageView.builder 小部件的属性

它拥有 PageView 的所有属性,并拥有一些自己的属性。


Stack 是 Fl utter SDK 的内置小部件,允许用户将小部件保持在彼此之上,从而形成小部件层。第一个小部件是最底部的项目,最后一个小部件是最顶部的项目。

Stack 小部件的一些关键点是:


让我们深入了解

首先,我们创建将在我们的应用程序中使用的数据。

在 lib 文件夹中创建 dummy_data.dart。在这里,我们放置项目数组。

dummy_data.dart:

var model = [
      "https://images-static.nykaa.com/uploads/f5a1d948-7947-4241-a08e-caac8d991c48.jpg?tr=w-300,cm-pad_resize",
      "https://images-static.nykaa.com/uploads/c622c7aa-7cdb-43ba-98b7-acb48df7f7c5.jpg?tr=w-300,cm-pad_resize",
      "https://images-static.nykaa.com/uploads/fea188e3-9067-4c1f-a3a3-07560f60d73d.jpg?tr=w-300,cm-pad_resize",
      "https://images-static.nykaa.com/uploads/2f2275d3-0b85-4189-8fb3-7318ca1c3bec.jpg?tr=w-300,cm-pad_resize",
      "https://images-static.nykaa.com/uploads/9a4d3606-9aeb-4285-8db1-4918428a1c76.jpg?tr=w-300,cm-pad_resize",
      "https://images-static.nykaa.com/uploads/455bf3cd-82d4-4b2c-ab5d-e56491edc0f1.jpg?tr=w-300,cm-pad_resize",
];

数据已准备就绪,现在让我们创建将成为网页浏览项目的小部件。 在 lib 文件夹中创建 page_view_item.dart。

page_view_item.dart

import 'package:flutter/material.dart';

class PageViewItem extends StatelessWidget {
  final int index;
  final String url;
  final double width;
  static const String name='';
  static const String price='';

  const PageViewItem({
    Key? key,
    required this.index,
    required this.width,
    required this.url,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return InkWell(
      onTap: () => print(index),
      child: Card(
        elevation: 5,
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(1.0),
        ),
        child: Image.network(
          url,
          fit: BoxFit.cover,

          width: width,
        ),
      ),
    );
  }
}

接下来我们创建 homepage.dart 文件:

首先,我们配置页面视图并创建提供 viewportFraction 的 PageController。

final _controller = PageController(    viewportFraction: 0.5,  );



视口分数

它定义了每个页面应该占据的视口部分。 默认为 1.0,这意味着每个页面在滚动方向上填充视口。

当我们的控制器被设置后,我们会计算页面浏览量的单个项目的宽度。

late final _itemWidth =MediaQuery.of(context).size.width * _controller.viewportFraction;

然后我们在 initState 中初始化控制器。

@override  void initState() {    
super.initState();
_controller.addListener(() => setState(() {          
_page = _controller.page!;        
}));  }

这就是我们的 homepage.dart 文件的外观。

homepage.dart:

import 'package:flutter/src/foundation/key.dart';
import 'package:flutter/src/widgets/framework.dart';

import 'package:flutter/material.dart';

import 'dummy_data.dart';
import 'page_view_item.dart';
class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  State createState() => _HomePageState();
}

class _HomePageState extends State {

  /// The current page of the page view
   double _page = 0;

  /// The index of the leftmost element of the list to be displayed
  int get _firstItemIndex => _page.toInt();

  /// Controller to get the current position of the page view
  final _controller = PageController(
    viewportFraction: 0.5,
  );

  /// The width of a single item
  late final _itemWidth =
      MediaQuery.of(context).size.width * _controller.viewportFraction;

@override
  void initState() {
    super.initState();
    _controller.addListener(() => setState(() {
          _page = _controller.page!;
        }));
  }
   @override
  void dispose() {
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("LV Scroll"),
      
      ),
      body: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          
          Stack(
          children: [
            Positioned.fill(
              child: Align(
                alignment: Alignment.centerLeft,
                child: SizedBox(
                  width: _itemWidth,
                  child: FractionallySizedBox(

                    child: PageViewItem(
                      index: _firstItemIndex,
                      width: _itemWidth,
                      url: model[_firstItemIndex],

                    ),
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 250,
              child: PageView.builder(
                padEnds: false,
                controller: _controller,
                itemBuilder: (context, index) {
                  return Opacity(
                    opacity: index <= _firstItemIndex ? 0 : 1,
                    child: PageViewItem(
                      index: index,

                      width: _itemWidth,
                      url: model[index],

                    ),
                  );
                },
                itemCount: model.length,
              ),
            ),
          ],
    ),
        ],
      ),
    );
  }
}


结论

我希望这篇文章对你有所帮助,并且你学到了新的东西。 我在这篇文章中使用了各种对你们中的一些人来说可能是新的东西。

展开阅读全文

页面更新:2024-04-30

标签:堆栈   视图   部件   应用程序   源码   属性   定义   页面   文件   项目   列表

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top