Flutter之中级Widget

跳转页面

1.Navigator.push:是跳转到下一个页面,它要接受两个参数一个是上下文context,另一个是要跳转的函数。

      Navigator.of(context).push(new MaterialPageRoute(builder: (context) {
        return new MainPage();
      }));

跳转传递参数:

Navigator.push(
  context, 
  MaterialPageRoute(
    builder:(context)=>new ProductDetail(data)
  )
);

2.Navigator.pop:是返回到上一个页面,使用时传递一个context(上下文)参数,使用时要注意的是,你必须是有上级页面的,也就是说上级页面使用了Navigator.push。

  • SingleChildScrollView滚动控件

属性一览:

SingleChildScrollView(
        //滑动的方向 Axis.vertical为垂直方向滑动,Axis.horizontal 为水平方向
        scrollDirection: Axis.vertical,
        //true 滑动到底部
        reverse: false,
        padding: EdgeInsets.all(0.0),
        滑动到底部回弹效果
        physics: BouncingScrollPhysics(),
        child: Center(
          child: Column(
            children: <Widget>[
              Container(color: Colors.white ,margin: EdgeInsets.only(top: 10),height: 440,),
              Container(color: Colors.green ,margin: EdgeInsets.only(top: 10),height: 540,),
            ],
          ),
        ),
    );
BottomNavigationBar

属性一览:

BottomNavigationBar({
    Key key,
    @required this.items,
    this.onTap,
    this.currentIndex = 0,
    this.elevation = 8.0,
    BottomNavigationBarType type,
    Color fixedColor,
    this.backgroundColor,
    this.iconSize = 24.0,
    Color selectedItemColor,
    this.unselectedItemColor,
    this.selectedIconTheme = const IconThemeData(),
    this.unselectedIconTheme = const IconThemeData(),
    this.selectedFontSize = 14.0,
    this.unselectedFontSize = 12.0,
    this.selectedLabelStyle,
    this.unselectedLabelStyle,
    this.showSelectedLabels = true,
    bool showUnselectedLabels,
  })

items是必须的参数,为BottomNavigationBarItem类型,需设置icon和text。onTap处理点击事件,可设置选中、未选中的字体大小和颜色。currentIndex:当前那个 tab 是 active 状态的。

示例:

class MainPage extends StatefulWidget {
  MainPage({Key key}) : super(key: key);

  _MyAppState createState() => _MyAppState();

}

class _MyAppState extends State<MainPage> {
  // This widget is the root of your application.
  int _currentIndex = 0;

  List<Widget> _pageList = [
    HomePage(),  //页面1
    XiguaPage(), //页面2
    MinePage(),  //页面3
  ];

  List<BottomNavigationBarItem> bottomItems = [
    BottomNavigationBarItem(
        icon: Icon(Icons.home, color: Colors.black54),
        activeIcon: Icon(Icons.home, color: Colors.red),
        title: Text("首页", style: TextStyle(fontSize: 12))
    ),
    BottomNavigationBarItem(
        icon: Icon(Icons.video_call_rounded, color: Colors.black54),
        activeIcon: Icon(Icons.video_call_rounded, color: Colors.red),
        title: Text("西瓜视频", style: TextStyle(fontSize: 12))
    ),
    BottomNavigationBarItem(
        icon: Icon(Icons.account_circle_rounded, color: Colors.black54),
        activeIcon: Icon(Icons.account_circle_rounded, color: Colors.red),
        title: Text("我的", style: TextStyle(fontSize: 12))
    )
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        body: this._pageList[this._currentIndex],
        bottomNavigationBar: BottomNavigationBar(
          selectedFontSize: 14,
          unselectedFontSize: 12,
          selectedItemColor: Colors.red,
          currentIndex: _currentIndex,
          type: BottomNavigationBarType.fixed,
          items: bottomItems,
          onTap: (int index) {
            setState(() {
              this._currentIndex = index;
            });
          },
        ),
      ),
    );
  }

}
AppBar+AppBarView

在Android中实现Tablayout+Viewpager的效果,Flutter中也必须有。

TabBar(
                controller,  
                isScrollable,  //是否开启滚动
                labelColor,  //选中文字颜色
                unselectedLabelColor,  //未选中文字颜色
                indicatorColor,  //指示器颜色
                tabs: ,  //tab文字内容
              ) 
TabBarView(
                controller,
                children,
              )

children为子页面的数组。

然后通过一个公共的TabController(length: tabs.length, vsync: this),来实现联动。

示例:

class HomePageContent extends StatefulWidget {
  HomePageContent({Key key, this.title}) : super(key: key);

  final String title;

  @override
  HomePageContentState createState() => HomePageContentState();
}

class HomePageContentState extends State<HomePageContent>
    with SingleTickerProviderStateMixin {
  List tabs = ["关注", "推荐", "热榜", "要闻", "新时代", "抗疫"];
  TabController tabController;
  var topBarHeight = 65;

  @override
  void initState() {
    super.initState();
    tabController = new TabController(length: tabs.length, vsync: this);
    tabController.addListener(() {
      var index = tabController.index;
    });
  }

  @override
  Widget build(BuildContext context) {

    return Scaffold(
      body: Container(
        child: Stack(
          children: [
            Container(
              width: MediaQuery.of(context).size.width,
              color: Colors.red,
              height: 85,
              padding: const EdgeInsets.only(left: 16, bottom: 2, right: 16),
              child: HomeSearchView(),
            ),
            Container(
              margin: const EdgeInsets.only(top: 130),
              child: TabBarView(
                controller: tabController,
                children: [
                  HomepageSubpage(),
                  HomepageSubpage(),
                  HomepageSubpage(),
                  HomepageSubpage(),
                  HomepageSubpage(),
                  HomepageSubpage(),
                ],
              ),
            ),
            Container(
              margin: const EdgeInsets.only(top: 85),
              child: TabBar(
                controller: tabController,
                isScrollable: true,
                labelColor: Colors.red,
                unselectedLabelColor: Colors.black87,
                indicatorColor: Colors.red,
                tabs: [
                  Tab(text: "关注"),
                  Tab(text: "推荐"),
                  Tab(text: "热榜"),
                  Tab(text: "要闻"),
                  Tab(text: "新时代"),
                  Tab(text: "抗疫"),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  • 点击事件

1.InkWell

new InkWell(
    child: new Text("Click me!"),
    onTap: () {
      // 单击
    },
    onDoubleTap: () {
      // 双击
    },
    onLongPress: () {
      // 长按
    }
  );

2.GestureDetector

return GestureDetector(
                onDoubleTap: (){
                  
                },
                onLongPress: () {
                  
                },
                onTap: () {
                  Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context) {
                    return MyWebView();
                  }));
                },
              child: Container()
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269