zoukankan      html  css  js  c++  java
  • Flutter Demo: PageView横向使用

    import 'package:flutter/material.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      final PageController ctrl = PageController(
        viewportFraction: 0.8,
      );
    
      List<SliderItem> sliders = [];
      String activeTag = 'anime';
      int currentPage = 0;
    
      @override
      void initState() {
        super.initState();
        _query();
        ctrl.addListener(() {
          int next = ctrl.page.round();
          if (currentPage != next) {
            setState(() {
              currentPage = next;
            });
          }
        });
      }
    
      _query({String tag = 'anime'}) {
        List<SliderItem> s =
            data.where((slider) => slider.tag.contains(tag)).toList();
    
        print(s.length);
        setState(() {
          sliders = s;
          activeTag = tag;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: PageView.builder(
            itemBuilder: (context, int index) {
              if (index == 0) {
                return _buildTagPage();
              } else if (sliders.length >= index) {
                bool active = currentPage == index;
                return _buildStoryPage(sliders[index - 1], active);
              } else {
                return Text('Not Data.');
              }
            },
            scrollDirection: Axis.horizontal,
            controller: ctrl,
            itemCount: sliders.length + 1,
          ),
        );
      }
    
      _buildButton(String tag) {
        Color color = tag == activeTag ? Colors.purple : Colors.white;
        return FlatButton(
          color: color,
          child: Text('#$tag'),
          onPressed: () => _query(tag: tag),
        );
      }
    
      Widget _buildTagPage() {
        return Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text(
                '选择你喜欢的标签: ',
                style: Theme.of(context).textTheme.title,
              ),
              _buildButton('anime'),
              _buildButton('girl'),
              _buildButton('jojo'),
            ],
          ),
        );
      }
    
      Widget _buildStoryPage(SliderItem slider, bool active) {
        final double blur = active ? 30 : 0;
        final double offset = active ? 20 : 0;
        final double top = active ? 100 : 200;
        return AnimatedContainer(
          duration: Duration(milliseconds: 500),
          curve: Curves.easeOutQuint,
          margin: EdgeInsets.only(top: top, left: 10, right: 10, bottom: 24),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
            image: DecorationImage(
              image: NetworkImage(slider.img),
              fit: BoxFit.cover,
            ),
            boxShadow: [
              BoxShadow(
                color: Colors.black87,
                blurRadius: blur,
                offset: Offset(offset, offset),
              ),
            ],
          ),
          child: Center(
            child: Text(
              slider.title,
              style: TextStyle(
                fontSize: 40,
                color: Colors.white,
              ),
            ),
          ),
        );
      }
    }
    
    List<SliderItem> data = [
      SliderItem(
        img: 'https://s2.ax1x.com/2019/07/02/ZJHheP.jpg',
        tag: ['anime', 'girl'],
        title: 'Anime1',
      ),
      SliderItem(
        img: 'https://s2.ax1x.com/2019/07/02/ZJHWLt.jpg',
        tag: ['anime', 'girl'],
        title: 'Anime2',
      ),
      SliderItem(
        img: 'https://s2.ax1x.com/2019/07/02/ZJHRsI.jpg',
        tag: ['anime', 'jojo'],
        title: 'Anime3',
      ),
    ];
    
    class SliderItem {
      SliderItem({this.img, this.tag, this.title});
      final String img;
      final List<String> tag;
      final String title;
    }
    
  • 相关阅读:
    Yii中缓存依赖的处理
    简单实现Tab切换(带框架)
    Server Application Unavailable出现的原因及解决方案集锦
    Microsoft.ReportViewer.WebForms, Version=10.0.0.0的报错问题,解决方案
    ASP.NET中树型DropDownList的绑定
    VS2010 使用时选择代码或双击时出错,点击窗口按钮后VS自动重启问题
    js实现文本框限制输入数字和小数点--兼容多个浏览器
    输入的全角字符转换成半角字符--css、js、ASP.NET
    sql把表格拼成字符串,多半使用于GROUP BY
    Sql将逗号分隔的字符串分拆成表格的方法
  • 原文地址:https://www.cnblogs.com/ajanuw/p/11123120.html
Copyright © 2011-2022 走看看