Flutter学习笔记

Flutter 的选项卡+控制器 实现多视图控制

2019-10-10  本文已影响0人  王俏

方法一:TabBar + TabController

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with TickerProviderStateMixin {
  List<Tab> _tabs;
  TabController _controller;

  Widget _tabContent;
  VoidCallback onChanged;
  int _currentIndex;
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    //初始化_tabs;
    _tabs = [
      Tab(text: 'TAB1'),
      Tab(text: 'TAB2'),
    ];

    //初始化当前
    _tabContent = Container();
    _controller = TabController(length: _tabs.length, vsync: this);
    onChanged = () {
      setState(() {
        _currentIndex = _controller.index;
        if (_currentIndex == 0) {
          _tabContent = Container(
            child: Text("TAB1"),
          );
        } else {
          _tabContent = Container(
            child: Text("TAB2"),
          );
        }
      });
    };
    _controller.addListener(onChanged);
  }

  @override
  void dispose() {
    // TODO: implement dispose
    _controller.removeListener(onChanged);
    _controller.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: <Widget>[
            SizedBox(height: 20,child: Container()),
            Container(
              //tabs背景色
              color: Colors.green,
              child: TabBar(
                //label字体颜色
                labelColor: Colors.yellow,
                indicatorWeight: 3.0,
                indicatorSize: TabBarIndicatorSize.tab,
                labelStyle: TextStyle(fontSize: 16.0, color: Colors.black12),
                controller: _controller,
                tabs: _tabs,
                // indicatorColor: Theme.of(context).primaryColor,
              ),
            ),
            _tabContent,
          ],
        ),
      ),
    );
  }
}

方法二:BottomNavigationBar

import 'package:flutter/material.dart';
import 'ir_manager_page.dart';
import 'editor_page.dart';
import 'tools_manager_page.dart';
import 'mine_page.dart';
class MainNavigationWidget extends StatefulWidget {
  @override
  _MainNavigationWidgetState createState() => _MainNavigationWidgetState();
}

class _MainNavigationWidgetState extends State<MainNavigationWidget> {
  
  int _currentIndex = 0;
  List<Widget> list = List();
  var tabImages;
  var appBarTitles = ['编辑', 'IR管理','工具' ,'我的'];

 /*
   * 根据选择获得对应的normal或是press的icon
   */
  Image getTabIcon(int curIndex) {
    if (curIndex == _currentIndex) {
      return tabImages[curIndex][1];
    }
    return tabImages[curIndex][0];
  }

  /*
   * 获取bottomTab的颜色和文字
   */
  Text getTabTitle(int curIndex) {
    if (curIndex == _currentIndex) {//选择tab的文字属性设置
      return new Text(appBarTitles[curIndex],
          style: new TextStyle(fontSize: 14.0, color: const Color(0xff1296db)));
    } else {//非选择tab的文字属性设置
      return new Text(appBarTitles[curIndex],
          style: new TextStyle(fontSize: 14.0, color: const Color(0xff515151)));
    }
  }

  /*
   * 根据image路径获取图片
   */
  Image getTabImage(path) {
    return new Image.asset(path, width: 24.0, height: 24.0);
  }

  @override
  void initState() {
    list
      ..add(HTEditorPage())
      ..add(HTIRManagerPage())
      ..add(HTToolsManagerPage())
      ..add(HTMinePage());

      //tab项图片
      tabImages = [
      [getTabImage('assets/images/editor.png'), getTabImage('assets/images/editor_selected.png')],
      [getTabImage('assets/images/ir.png'), getTabImage('assets/images/ir_selected.png')],
      [getTabImage('assets/images/tool.png'), getTabImage('assets/images/tool_selected.png')],
      [getTabImage('assets/images/mine.png'), getTabImage('assets/images/mine_selected.png')]
    ];
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: list[_currentIndex],
        bottomNavigationBar: BottomNavigationBar(
            onTap: (int index) {
              setState(() {
                _currentIndex = index;
              });
            },
            currentIndex: _currentIndex,
            showUnselectedLabels:true,
            type: BottomNavigationBarType.fixed,
            items: [
              BottomNavigationBarItem(
                  icon: getTabIcon(0), title: getTabTitle(0)),
              BottomNavigationBarItem(
                  icon: getTabIcon(1), title: getTabTitle(1)),
              BottomNavigationBarItem(
                  icon: getTabIcon(2), title: getTabTitle(2)),
               BottomNavigationBarItem(
                  icon: getTabIcon(3), title: getTabTitle(3)),
            ]));
  }
}
上一篇下一篇

猜你喜欢

热点阅读