FlutterFlutter 基础学习Flutter开发圈

Flutter 学习 - 基础框架

2019-03-20  本文已影响587人  迷途小顽童

关于Flutter的安装以及完成helloword的开发大家可以参考

前言

在实际的项目开发中,我们目前市面上所看到的项目,如抖音、微信、淘宝


抖音_微信_淘宝.png

分析上图其基本框架大致如下


通用APP模版简图.png

正文 -- 效果图

下面我们就来实现上面图中内容的实现方式,先来看下效果图


基础框架_无沉浸式状态栏.gif

正文 -- 实现方式

这里实现底部Tab控件父布局使用的是Flutter自带对BottomNavigationBar,Tab的每个Item则是实用BottomNavigationBarItem实现,整个app的内容是放在了Scaffold这个Widget中的,BottomNavigationBar 的上方显示主内容的区域的是PageView,来放置我们的各个页面,包括滑动切换(这里是用PageView的controller属性,下面会详细介绍)


基础框架布局简图.png

这里构建的时候是自己创建了一个类,来统一管理BottomNavigationBarItem的一些属性

NavigationIconView({Key key, String title, Widget icon, Widget activeIcon})
      : _title = title,//title内容
        _activeIcon = activeIcon,//选中的时候显示的图标
        _icon = icon,//未选中的时候显示的图标
        item = new BottomNavigationBarItem(
            icon: icon,
            activeIcon: activeIcon,
            title: Text(
              title,
              style: TextStyle(fontSize: ScreenUtil.getInstance().setSp(32)),
            ),
            backgroundColor: Colors.white);

然后就是添加我们的底部TabItem到一个Widget集合中,然后添加到我们的BottomNavigationBar中,这里我们实用for循环进行创建,你可以根据自己底部的数量进行添加,我是把这些数据全都添加到了一个配置项中,方便管理

for (var i = 0; i < TabConfig.HOME_TAB_TITLES.length; ++i) {
        NavigationIconView navigationIconView = NavigationIconView(
            title: TabConfig.HOME_TAB_TITLES[i],
            icon: Image.asset(
              TabConfig.HOME_TAB_NORMALICON[i],
              width: TabConfig.width,
              height: TabConfig.height,
            ),
            activeIcon: Image.asset(
              TabConfig.HOME_TAB_ACTIVEICON[i],
              width: TabConfig.width,
              height: TabConfig.height,
            )
        );
        _navigationViews.add(navigationIconView);

      }

我们已经创建完成了BottomNavigationBarItem的集合,现在就是要把这个集合添加到我们BottomNavigationBar中

BottomNavigationBar navigationBar = BottomNavigationBar(
        fixedColor: Color(AppColors.AppTabTextColor),
        items: _navigationViews //底部BarItem的集合
            .map((NavigationIconView navigationIconView) =>
        navigationIconView.item)
            .toList(),
        currentIndex: _currentIndex,
        type: BottomNavigationBarType.fixed,
        onTap: (int index) {
          setState(() {
            _currentIndex = index;
          });
        });

首先我们要先创建pageview所需的数据主界面中各个页面的集合

 _pages = [
      Container(color: Colors.green),
      Container(color: Colors.blue),
      Container(color: Colors.yellow),
      Container(color: Colors.green),

我们的父布局是实用的Scaffold这个Widget 在实用的时候就可以直接创建

return Scaffold(
      body: PageView.builder(
        itemBuilder: (BuildContext context, int index) {
          return _pages[index];
        },
        controller: _pageController,
        itemCount: _pages.length,
        onPageChanged: (int index) {
          setState(() {
            _currentIndex = index;
          });
        },
      ),
      bottomNavigationBar: navigationBar,
    );

这时我们就可以直接操作左右滑动各个page页面了,但是现在点击tab的时候还不能进行page之间的切换,我们还需要做个处理,上面的代码中我们有看到一个参数controller,这个就是我们来控制切换的,它的创建方式是

_pageController = new PageController(
        initialPage: _currentIndex, keepPage: true, viewportFraction: 1.0);

这时候我们就需要在BottomNavigationBar的onTap方法中的onState()方法中添加一段代码,如下

onTap: (int index) {
          setState(() {
            _currentIndex = index;
            _pageController.animateToPage(index,
                duration: Duration(milliseconds: 200), curve: Curves.easeInOut);
          });

优化细节

细心的朋友应该已经看出来了,我们上面的效果图是没有沉浸式的,现在沉浸式状态栏已经是app的标配了,Flutter当然也是支持的,下面就是带有沉浸式状态栏的效果


基础框架_沉浸式状态栏.gif

实现方式其实也很简单,我们只需要判断下平台是不是Android,然后调用

  //对系统平台进行判断,如果是android则设置沉浸式状态栏
  if(Platform.isAndroid){
    //注意:这里要写在组件渲染之后,不然会被组件属性覆盖
    SystemUiOverlayStyle systemUiOverlayStyle = SystemUiOverlayStyle(statusBarColor: Colors.transparent);
    SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
  }

这样我们的基本框架就搭建完成了,后面就可以在各个页面中完成项目中所需要的UI,该项目已被放在Github上面进行开源,内容在不断更新中,后续还会有更多实际项目中所要用到的基础知识,如有问题,也欢迎大家留言,指正。

上一篇 下一篇

猜你喜欢

热点阅读