/lib/main.dart
import 'package:flutter/cupertino.dart'; //IOS
import 'package:flutter/material.dart'; //Android
main(),flutter的入口函數為 runApp()(由 package:flutter/material.dart 提供)
import 'package:flutter/material.dart';
void main() {
runApp(MaterialApp(home: HomePage()));
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'Phoho Show',
style: TextStyle(color: Color(0xFFFFF600)),
),
),
body: Column(
children: [
Image.network(
'https://cdn.pixabay.com/photo/2016/12/11/12/02/bled-1899264_960_720.jpg'),
Image.network(
'https://cdn.pixabay.com/photo/2017/01/19/23/46/panorama-1993645_960_720.jpg'),
Image.network(
'https://cdn.pixabay.com/photo/2017/12/15/13/51/polynesia-3021072_960_720.jpg'),
],
),
);
}
}
runApp()函數可以將根組件填滿整個螢幕(不用程式也會跑,只是螢幕上啥都沒有),可視為flutter框架的入口
MaterialApp()則是套用Material風格的app入口,源自 C:\src\flutter\packages\flutter\lib\src\material\app.darthome 參數用來設定首頁頁面的Widgetnew 來建立 class,不然應該要寫 new HomePage()StatelessWidget 是無狀態組件(不需要改變物件狀態時使用,較省資源):所有屬性均不可變,所有值都是final(如:MyApp)StatefulWidget 是有狀態組件(物件狀態會被改變時使用,系統需隨時監控狀態,所以稍耗資源):可在Widget生命周期間發生變化,實現StatefulWidget 至少需要兩個類
StatefulWidget:裡面只要有個createState()即可。State:在Widget生命周期間始終存在(如:_MyHomePageState )
build() 用來繪製畫面Scaffold() 是設定好的畫面鷹架
appBar:定義App標題,可以用 AppBar() 來定義App上方標題的外觀及內容MaterialApp中定義的屬於全局主題):
new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
);
詳情可參考:https://flutterchina.club/cookbook/design/themes/
| 屬性 | 解釋 |
|---|---|
| brightness | Brightness類型,應用程序的整體主題亮度。用於按鈕等小部件,以確定在不使用主色(primaryColor)或強調色(accentColor)時選擇什麼顏色。當亮度較暗時,畫布、卡片和原色都較暗。當亮度為光時,畫布和卡片的顏色是明亮的,原色的暗度根據原色亮度變化。當亮度較暗時,原色(primaryColor)與卡片和畫布顏色的對比度較差;當亮度較暗時,用白色或亮藍色來對比。 |
| primaryColor | Color類型,App主要部分的背景色(ToolBar,Tabbar等) |
| primaryColorBrightness | Brightness類型,primaryColor的亮度,用於確定設置在primaryColor上部的文本和圖標顏色(如:工具欄文本(toolbar text))。 |
| primaryColorLight | Color類型,primaryColor的較淺版本 |
| primaryColorDark | Color類型,primaryColor的較深版本 |
| accentColor | Color類型,前景色(按鈕、文本、覆蓋邊緣效果等) |
| accentColorBrightness | Brightness類型,accentColor的亮度。用於確定位於accentColor上部的文本和圖標顏色(例如,浮動操作按鈕(FloatingButton)上的圖標) |
| canvasColor | Color類型,MaterialType.canvas Material的默認顏色。 |
| scaffoldBackgroundColor | Color類型,作為Scaffold下的Material默認顏色,用於materia應用程序或app內頁面的背景色。 |
| bottomAppBarColor | Color類型,bottomAppBarColor的默認顏色。這可以通過指定BottomAppBar.color來覆蓋。 |
| cardColor | Color類型,用在卡片(Card)上的Material的顏色。 |
| dividerColor | Color類型,分隔符(Dividers)和彈窗分隔符(PopupMenuDividers)的顏色,也用於ListTiles和DataTables的行之間。要創建使用這種顏色的合適的邊界,請考慮Divider.createBorderSide。 |
| highlightColor | Color類型,用於墨水噴濺動畫或指示菜單被選中時的高亮顏色 |
| splashColor | Color類型,墨水濺出的顏色 |
| splashFactory | InteractiveInkFeatureFactory類型,定義InkWall和InkResponse產成的墨水噴濺時的外觀。 |
| selectedRowColor | Color類型,用於高亮選定行的顏色。 |
| unselectedWidgetColor | Color類型,小部件處於非活動(但啟用)狀態時使用的顏色。例如,未選中的複選框。通常與accentColor形成對比。 |
| disabledColor | Color類型,無效的部件(widget)的顏色,不管它們的狀態如何。例如,一個禁用的複選框(可以選中或不選中)。 |
| buttonColor | Color類型,Material中RaisedButtons使用的默認填充色。 |
| buttonTheme | ButtonThemeData類型,定義按鈕小部件的默認配置,如RaisedButton和FlatButton。 |
| secondaryHeaderColor | Color類型,有選定行時PaginatedDataTable標題的顏色 |
| textSelectionColor | Color類型,文本字段(如TextField)中文本被選中的顏色。 |
| cursorColor | Color類型,在 Material-style 文本字段(如TextField)中光標的顏色。 |
| textSelectionHandleColor | Color類型,用於調整當前選定文本部分的句柄的顏色。 |
| backgroundColor | Color類型,與primaryColor對比的顏色(例如 用作進度條的剩餘部分)。 |
| dialogBackgroundColor | Color類型,Color類型,Dialog元素的背景色 |
| indicatorColor | Color類型,TabBar中選項選中的指示器顏色。 |
| hintColor | Color類型,用於提示文本或佔位符文本的顏色,例如在TextField中。 |
| errorColor | Color類型,用於輸入驗證錯誤的顏色,例如在TextField中。 |
| toggleableActiveColor | Color類型,用於突出顯示切換Widget(如Switch,Radio和Checkbox)的活動狀態的顏色。 |
| fontFamily | String類型,字體類型 |
| textTheme | TextTheme類型,與卡片和畫布對比的文本顏色 |
| primaryTextTheme | TextTheme類型,與primary color形成對比的文本主題。 |
| accentTextTheme | TextTheme類型,與accent color形成對比的文本主題。 |
| inputDecorationTheme | InputDecorationTheme類型,InputDecorator、TextField和TextFormField的默認InputDecoration值基於此主題。 |
| iconTheme | IconThemeData類型,與卡片和畫布顏色形成對比的圖標主題。 |
| primaryIconTheme | IconThemeData類型,與原色(primary color)形成對比的圖標主題。 |
| accentIconTheme | IconThemeData類型,與前景色(accent color)形成對比的圖標主題。 |
| sliderTheme | SliderThemeData類型,SliderThemeData類型,用於渲染Slider的顏色和形狀。 |
| tabBarTheme | TabBarTheme類型, 一個主題,用於自定義選項卡欄指示器的尺寸、形狀和顏色。 |
| chipTheme | ChipThemeData類型,用於Chip的顏色和樣式 |
| platform | TargetPlatform類型,widget應該適應目標的平台。 |
| materialTapTargetSize | MaterialTapTargetSize類型,配置特定材料部件的hit測試大小。 |
| pageTransitionsTheme | PageTransitionsTheme類型,每個目標平台的默認MaterialPageRoute轉換。 |
| colorScheme | ColorScheme類型,一組13種顏色,可用於配置大多數組件的顏色屬性。 |
| typography | Typography類型,用於配置TextTheme、primaryTextTheme和accentTextTheme的顏色和幾何文本主題值。 |
局部主題:若只有某些地方會用得到的話,有兩種方式,第一種是建立一個特有的主題:
new Theme(
data: new ThemeData(
primarySwatch: Colors.blue,
),
child: new FloatingActionButton(
onPressed: () {},
child: new Icon(Icons.add),
),
);
第二種是擴展父主題(主要是用copyWith方法):
new Theme(
data: Theme.of(context).copyWith(accentColor: Colors.yellow),
child: new FloatingActionButton(
onPressed: null,
child: new Icon(Icons.add),
),
);
函數Theme.of(context)會通過內文來取得主題設定(如果找不到,就會找全局主題)
完整範例
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
final appName = '自定義主題';
return new MaterialApp(
title: appName,
theme: new ThemeData(
brightness: Brightness.light,
primaryColor: Colors.lightGreen[600],
accentColor: Colors.orange[600],
),
home: new MyHomePage(
title: appName,
),
);
}
}
class MyHomePage extends StatelessWidget {
final String title;
MyHomePage({Key key, this.title}) : super(key: key);
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text(title),
),
body: new Center(
child: new Container(
color: Theme.of(context).accentColor,
child: new Text(
'套用背景顏色的文字組件',
style: Theme.of(context).textTheme.title,
),
),
),
floatingActionButton: new Theme(
data: Theme.of(context).copyWith(accentColor: Colors.grey),
child: new FloatingActionButton(
onPressed: null,
child: new Icon(Icons.add),
),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}