Flutter仿微信(一)項(xiàng)目搭建和資源配置

有狀態(tài)和無狀態(tài)

  • 因?yàn)镕lutter的渲染是增量渲染,界面渲染是直接將需要更改的Widget替換成新的Widget
  • 自定義的Widget內(nèi)部屬性大部分是final修飾,而且很多構(gòu)造方法都加了const修飾成常量
  • 渲染邏輯數(shù)據(jù)邏輯是分開管理,保留數(shù)據(jù)邏輯,Widget每次都會(huì)創(chuàng)建一個(gè)新的,而數(shù)據(jù)會(huì)保留
  • 如果當(dāng)前Widget中有數(shù)據(jù)邏輯,那么當(dāng)前Widget應(yīng)該是有狀態(tài)的

項(xiàng)目搭建

  • MaterialApp
    • theme:設(shè)置主題色
    • home:入口
      • Scaffold:容器:例如
        • AppBar:頂部導(dǎo)航欄
        • drawer:側(cè)邊欄
        • body:因?yàn)镕lutter是樹渲染的,而tabbar點(diǎn)擊切換后需要保存上一個(gè)頁面的狀態(tài),所有只有將頁面保存在樹中才能實(shí)現(xiàn)
          • PageView:分頁
        • bottomNavigationBar:底部導(dǎo)航欄
          • items:底部按鈕List
          • onTap:點(diǎn)擊item回調(diào)
          • type:樣式(三個(gè)以上必須設(shè)置,否則默認(rèn)白色)
class RootPage extends StatefulWidget {
  @override
  _RootPageState createState() => _RootPageState();
}

class _RootPageState extends State <RootPage>{
  int _currentIndex = 0;
  final PageController _pageController = PageController();
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      body: PageView(
        controller: _pageController,
        children: _vcList,
      ),
      bottomNavigationBar: BottomNavigationBar(
          onTap:(index){
            setState(() {
              _currentIndex = index;
              _pageController.jumpToPage(_currentIndex);//切換
            });
          },
          selectedFontSize: 12.0,//選中字體
          type:BottomNavigationBarType.fixed ,//items>3時(shí)必須設(shè)置
          currentIndex: _currentIndex,
          items:_itemList,
      )
    );
  }
}

final List<Widget> _vcList = [ChatPage(),FriendsPage(),DiscoveryPage(),MinePage()];

final List<BottomNavigationBarItem> _itemList = [
   BottomNavigationBarItem(
       icon: Image.asset(
          'images/tabbar_chat.png',
          height: 20,
          width: 20,
      ),
      activeIcon: Image.asset(
        'images/tabbar_chat_hl.png',
        height: 20,
        width: 20,
    ),
      label: '微信'
  ),
   BottomNavigationBarItem(
       icon: Image.asset(
         'images/tabbar_friends.png',
         height: 20,
         width: 20,
       ),
       activeIcon: Image.asset(
         'images/tabbar_friends_hl.png',
         height: 20,
         width: 20,
       ),
       label: '通訊錄'
  ),
   BottomNavigationBarItem(
      icon: Image.asset(
        'images/tabbar_discover.png',
        height: 20,
        width: 20,
      ),
      activeIcon: Image.asset(
        'images/tabbar_discover_hl.png',
        height: 20,
        width: 20,
      ),
      label: '發(fā)現(xiàn)'
  ),
   BottomNavigationBarItem(
      icon: Image.asset(
        'images/tabbar_mine.png',
        height: 20,
        width: 20,
      ),
      activeIcon: Image.asset(
        'images/tabbar_mine_hl.png',
        height: 20,
        width: 20,
      ),
      label: '我'
  ),
];

安卓配置

找到AndroidManifest.xml,配置包名等,類似iOS中的info.plist
![image.png](https://upload-images.jianshu.io/upload_images/16490557-28fad314d384a662.png?imageMogr2/auto-[圖片上傳中...(image.png-9d5077-1636354529650-0)]
orient/strip%7CimageView2/2/w/1240)

iocn配置

圖片名字不能駝峰命名

image.png

啟動(dòng)圖配置

image.png

項(xiàng)目配置

pubspec.yaml文件中進(jìn)行配置,注意配置時(shí)的空格要對(duì)齊

image.png

項(xiàng)目地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 8,164評(píng)論 0 4
  • 公元:2019年11月28日19時(shí)42分農(nóng)歷:二零一九年 十一月 初三日 戌時(shí)干支:己亥乙亥己巳甲戌當(dāng)月節(jié)氣:立冬...
    石放閱讀 7,524評(píng)論 0 2
  • 今天上午陪老媽看病,下午健身房跑步,晚上想想今天還沒有斷舍離,馬上做,衣架和旁邊的的布衣架,一看亂亂,又想想自己是...
    影子3623253閱讀 3,076評(píng)論 3 8

友情鏈接更多精彩內(nèi)容