[Flutter-2]HelloVicent综合页——需求分析/实现头部滚动条

96 阅读3分钟

今天是2023-12-21,项目第二天

cutdisplay.gif

为了动态头像上传的一个gif图,操作方式参考

2023 更换掘金动态头像

ok,开始正文;

下一步,首页的代码编写;

分析页面

创建了 SummaryPage.dart, 贴图分析下页面构造:

最新.jpg

从上至下实现的需求和步骤为:

  1. 实现一个滚动条,固定的标题,包含7个,【关注,软件,最新,推荐,问答,博客,英文】,当前页字体放大,跟下面的页面联动,下方滑动页面,上方标题跟着改变;

  2. 最右侧加入一个搜索按钮,点击进入搜索页;

  3. 实现一个带圆角的轮播图,同时显示标题和一排指示点;

  4. 实现一个List滚动视图,每行单元元素包含,标签,标题,作者,日期,评价数,如带图片在右侧显示图片;

实现一个滚动条

使用的TabController + AppBar + TabBar + TabBarView;

参考文档:

遇到的问题

  • AppBar 出现阴影和下划线。
    • 有两种方式解决下划线,在 main.dart 文件找到定义theme处:
    theme: ThemeData(
        primaryColor: themeColor,
        //PlanA 不用新样式 
        useMaterial3: false,
    
        //planB 下划线设为透明
        tabBarTheme: const TabBarTheme(dividerColor: Colors.transparent)
        ),
    
    • 解决阴影,useMaterial3为true是默认没有阴影,可以自己试试;
      appBar: AppBar(
        backgroundColor: Colors.white,
        // MaterialApp 的 ThemeData设置useMaterial3为true会去掉阴影
        // 设置false去掉下划线会显示阴影,需要设置阴影高度elevation为0
        elevation: 0,
    
  • ImageIcon 设置读取本地图片然后赋值给到 IconButton 后,运行不显示,通过 Flutter DevTools查看元素属性,发现,默认color是白色,因此在白色背景下,不会显示;需自己设置一个颜色;
IconButton(
  onPressed: () {
    Navigator.push(context,
        MaterialPageRoute(builder: (context) => const SearchPage()));
  },
  icon: const ImageIcon(
    AssetImage("assets/images/ic_search.png")  ,
    //ImageIcon 默认为白色,需设置为想要的颜色
    color: Colors.black,
  ),
)

实现效果

IMG_4989.PNG

完整代码



import 'package:flutter/material.dart';
import 'package:hello_oschina/pages/SearchPage.dart';
class SummaryPage extends StatefulWidget {

  @override
  State<SummaryPage> createState() => _SummaryPageState();
}

class _SummaryPageState extends State<SummaryPage> with SingleTickerProviderStateMixin {

  final List<Tab> _tabs = <Tab>[
    const Tab(text: "关注"),
    const Tab(text: "软件"),
    const Tab(text: "最新"),
    const Tab(text: "推荐"),
    const Tab(text: "问答"),
    const Tab(text: "博客"),
    const Tab(text: "英文"),
  ];
  final List<Widget> _tabBars = [
    const Center(child: Tab(text: "关注")),
    const Center(child: Tab(text: "软件")),
    const Center(child: Tab(text: "最新")),
    const Center(child: Tab(text: "推荐")),
    const Center(child: Tab(text: "问答")),
    const Center(child: Tab(text: "博客")),
    const Center(child: Tab(text: "英文")),
  ];

  late TabController _tabController;
  
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    
    _tabController = TabController(length: _tabs.length, vsync: this);
    _tabController.index = 2;
    setState(() {

    });

    //监听器
    _tabController.addListener(() {
      //点击切换tab的时候执行了一个动画效果,滑动切换的时候是没有的,在这个过程中触发了一次Listener,所以触发了两次addListener方法
      // 解决点击tab执行2次的问题
      if(_tabController.index ==_tabController.animation?.value) {
        //实现自定义的功能
        print(_tabController.index);
      }
    });
  }

  void pressSearchButton(){
    print("go search page");

  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.white,
        // MaterialApp 的 ThemeData设置useMaterial3为true会去掉阴影
        // 设置false去掉下划线会显示阴影,需要设置阴影高度elevation为0
        elevation: 0,
        title: TabBar(
          controller: _tabController,
          indicatorColor: Colors.transparent,
          labelColor: Colors.black,
          unselectedLabelColor: Colors.grey,
          isScrollable: true,
          tabs: _tabs,
          labelStyle: const TextStyle(fontSize: 24.0,fontWeight: FontWeight.w900),
          unselectedLabelStyle: const TextStyle(fontSize: 14.0,fontWeight: FontWeight
              .w900),
        ),
        actions: <Widget>[
          IconButton(
            onPressed: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (context) => const SearchPage()));
            },
            icon: const ImageIcon(
              AssetImage("assets/images/ic_search.png")  ,
              //ImageIcon 默认为白色,需设置为想要的颜色
              color: Colors.black,
            ),
          )
        ],
      ),
      body: TabBarView(
        controller: _tabController,
        children: _tabBars,
      ),
    );
  }
}

以上;