当前位置 主页 > 服务器问题 > Linux/apache问题 >

    使用Flutter实现一个走马灯布局的示例代码

    栏目:Linux/apache问题 时间:2019-11-25 22:11

    走马灯是一种常见的效果,本文讲一下如何用 PageViewFlutter 里实现一个走马灯, 效果如下,当前页面的高度比其它页面高,切换页面的时候有一个高度变化的动画。实现这样的效果主要用到的是 PageView.builder 部件。

     

    开发

     创建首页

    首先创建一个 IndexPage 部件,这个部件用来放 PageView ,因为需要使用 setState 方法更新 UI,所以它是 stateful 的。

    import 'package:flutter/material.dart';
    
    class IndexPage extends StatefulWidget {
     @override
     _IndexPageState createState() => _IndexPageState();
    }
    
    class _IndexPageState extends State<IndexPage> {
     @override
     Widget build(BuildContext context) {
     return Scaffold(
     appBar: AppBar(
     elevation: 0.0,
     backgroundColor: Colors.white,
     ),
     body: Column(
     children: <Widget>[],
     ),
     );
     }
    }
    

    然后在部件内申明一个 _pageIndex 变量用来保存当前显示的页面的 index,在 initState 生命周期里面初始化一个 PageController 用来配置 PageView 部件。

    bodyColumn 里面创建一个 PageView.builder ,使用一个 SizedBox 部件指定 PageView 的高度,将 controller 设置为 _pageController ,在 onPageChanged 事件里将当前显示页面的 index 值赋值给 _pageIndex 变量。

    int _pageIndex = 0;
    PageController _pageController;
    
    @override
    void initState() {
     super.initState();
     _pageController = PageController(
     initialPage: 0,
     viewportFraction: 0.8,
     );
    }
    
    body: Column(
     children: <Widget>[
     SizedBox(
     height: 580.0,
     child: PageView.builder(
     itemCount: 3,
     pageSnapping: true,
     controller: _pageController,
     onPageChanged: (int index) {
      setState(() {
      _pageIndex = index;
      });
     },
     itemBuilder: (BuildContext ctx, int index) {
      return _buildItem(_pageIndex, index);
     },
     ),
     ),
     ],
    ),

    关键点: 设置 PageControllerviewportFraction 参数小于 1,这个值是用来设置每个页面在屏幕上显示的比例,小于 1 的话,就可以在当前页面同时显示其它页面的内容了。

    /// The fraction of the viewport that each page should occupy.
    /// Defaults to 1.0, which means each page fills the viewport in the scrolling direction.
    final double viewportFraction;

    实现 _buildItem

    接着实现 _buildItem 方法,这个方法就是返回 PageView.builder 里每一个页面渲染的内容,第一个参数 activeIndex 是当前显示在屏幕上页面的 index ,第二个参数 index 是每一项自己的 index

    使用一个 Center 部件让内容居中显示,然后用一个 AnimatedContainer 添加页面切换时的高度变化的动画效果,切换页面的时候使用了 setState 方法改变了 _pageIndexFlutter 重新绘制每一项。关键点在于判断当前页面是否为正在显示的页面,是的话它的高度就是 500 不是的话就是 450。