一统天下 flutter

Posted webabcd - 专注于 flutter, android

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一统天下 flutter相关的知识,希望对你有一定的参考价值。

一统天下 flutter - widget 滚动类: DraggableScrollableSheet - 可滚动组件,并且支持通过拖拽的方式上下展开

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget 滚动类: DraggableScrollableSheet - 可滚动组件,并且支持通过拖拽的方式上下展开

示例如下:

lib\\widget\\scroll\\draggable_scrollable_sheet.dart

/*
 * DraggableScrollableSheet - 可滚动组件,并且支持通过拖拽的方式上下展开
 */

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

import \'../../helper.dart\';

class DraggableScrollableSheetDemo extends StatefulWidget 
  const DraggableScrollableSheetDemo(Key? key) : super(key: key);

  @override
  _DraggableScrollableSheetDemoState createState() => _DraggableScrollableSheetDemoState();


class _DraggableScrollableSheetDemoState extends State<DraggableScrollableSheetDemo> 

  @override
  Widget build(BuildContext context) 
    return Scaffold(
      appBar: AppBar(title: const Text("title")),
      backgroundColor: Colors.orange,
      /// 监听当 DraggableScrollableSheet 的展开的高度发生变化时的通知
      body: NotificationListener<DraggableScrollableNotification>(
        onNotification: (notification) 
          /// 当前展开的高度(占用父的百分比)
          log(\'extent:$notification.extent\');
          return true;
        ,
        child: _buildDraggableScrollableSheet(),
      ),
    );
  

  Widget _buildDraggableScrollableSheet() 
    return DraggableScrollableSheet(
      /// 初始时的高度(占用父的百分比)
      initialChildSize: 0.3,
      /// 最大高度(占用父的百分比)
      minChildSize: 0.1,
      /// 最小高度(占用父的百分比)
      maxChildSize: 1,
      /// 是否需要扩展以填充父的可用空间
      expand: true,
      /// 上下展开时,高度是否只能是固定的几个值
      /// false - 上下展开时,高度根据你的拖拽行为走
      /// true - 上下展开时,高度只能是 minChildSize, maxChildSize, snapSizes 中指定的值
      snap: true,
      snapSizes: const [],
      /// snap 为 true 时,上下展开的高度变化时,动画的持续时间(默认为 null 会根据你的拖拽速度和变化长度自动决定)
      snapAnimationDuration: null,
      /// 注:这里需要包含一个可滚动组件,本例用的是 ListView
      builder: (BuildContext context, ScrollController scrollController) 
        return Container(
          color: Colors.green,
          child: ListView.builder(
            controller: scrollController,
            itemCount: 20,
            itemBuilder: (BuildContext context, int index) 
              return ListTile(title: Center(child: MyTextSmall(\'$index\')));
            ,
          ),
        );
      ,
    );
  

一统天下 flutter https://github.com/webabcd/flutter_demo
作者 webabcd

Flutter学习日记之PageView+Indicator指示器实现引导页

本文地址:https://blog.csdn.net/qq_40785165/article/details/118400571,转载需附上此地址

大家好,我是小黑,一个还没秃头的程序员~~~

天下事以难而废者十之一,以惰而废者十之九

本次给大家分享的是如何用Flutter中的PageView组件配合Indicator指示器实现常见的App引导页,源码地址:https://gitee.com/fjjxxy/flutter-study.git,效果如下:

在这里插入图片描述

(一)PageView介绍

PageView用来实现一个可以显示的逐页滑动的列表,基本参数如下:

参数说明
scrollDirection滑动的方向
reversechildren是否反过来
controller控制器,可以定义初始索引、是否沾满屏幕等
onPageChanged页面变化的监听
children页面集合
pageSnapping页面是否会自动返回上一页/翻页等效果,设置为false便不会有这些效果

代码如下:

          PageView(
            scrollDirection: Axis.horizontal,
            reverse: false,
            onPageChanged: (index) {
              setState(() {
                _index = index;
              });
            },
            controller: PageController(
                initialPage: 0, keepPage: false, viewportFraction: 1),
            pageSnapping: true,
            physics: ClampingScrollPhysics(),
            children: [
              Container(
                width: double.infinity,
                height: double.infinity,
                decoration: BoxDecoration(
                    image: DecorationImage(
                        image: AssetImage(
                            "assets/images/image_guide_2.jpg"),
                        fit: BoxFit.fill)),
              ),
              Container(
                width: double.infinity,
                height: double.infinity,
                decoration: BoxDecoration(
                    image: DecorationImage(
                        image: AssetImage(
                            "assets/images/image_guide_1.jpg"),
                        fit: BoxFit.fill)),
              ),
              Container(
                width: double.infinity,
                height: double.infinity,
                decoration: BoxDecoration(
                    image: DecorationImage(
                        image: AssetImage(
                            "assets/images/image_guide_3.jpg"),
                        fit: BoxFit.fill)),
                child: Stack(
                  alignment: Alignment.bottomCenter,
                  children: [
                    Positioned(
                        bottom: 100,
                        child: ElevatedButton(
                            onPressed: () {
                              Navigator.pushNamed(context, "/main");
                            },
                            style: ButtonStyle(
                                backgroundColor:
                                    MaterialStateProperty.all(Colors.white),
                                foregroundColor:
                                    MaterialStateProperty.all(Colors.black),
                                shape: MaterialStateProperty.all(
                                    RoundedRectangleBorder(
                                        borderRadius:
                                            BorderRadius.circular(10))),
                                side: MaterialStateProperty.all(
                                    BorderSide(color: Colors.white))),
                            child: Text("开启Flutter学习之旅")))
                  ],
                ),
              )
            ],
          )

(二)指示器

Demo中用到的指示器插件是dots_indicator
添加依赖:

dots_indicator: ^2.0.0

引入:

import 'package:dots_indicator/dots_indicator.dart';

基本参数如下:

参数说明
dotsCount指示器数量
position当前的位置
decorator指示器的样式
reversed是否反过来
mainAxisAlignment对齐方式

代码如下:

 DotsIndicator(
                  mainAxisAlignment: MainAxisAlignment.center,
                  reversed: false,
                  dotsCount: 3,
                  position: _index.toDouble(),
                  decorator: DotsDecorator(
                    color: Colors.black87, // Inactive color
                    activeColor: Colors.redAccent,
                  ))

使用Stack+Positioned就可以完成布局中组件的摆放了,很简单的一个页面需求,因为很经常被使用,所以记录下来,本次PageView组件配合Indicator指示器实现App引导页的内容就介绍完了,感兴趣的小伙伴可以下载源码看一下,希望大家可以点个Star,支持一下小白的flutter学习经历,最后,希望喜欢我文章的朋友们可以帮忙点赞、收藏,也可以关注一下,如果有问题可以在评论区提出,后面我会持续更新Flutter的学习记录,与大家分享,谢谢大家的支持与阅读!

以上是关于一统天下 flutter的主要内容,如果未能解决你的问题,请参考以下文章

一统天下 flutter

一统天下 flutter

一统天下 flutter

一统天下 flutter

一统天下 flutter

一「表」走天下,Flutter瀑布流及通用列表解决方案