# Widget widget有分兩種: 1. StatelessWidget 2. StatefulWidget ### StatelessWidget 完全沒有資料的靜態Widget,通常會用來當作頁面layout使用 ```java class MyAppBar extends StatelessWidget { MyAppBar({this.count}); final int count; @override Widget build(BuildContext context) { return Text('Count: $count'); } } ``` ### StatefulWidget 通常會搭配`State`一起實現 ```java class Counter extends StatefulWidget { @override _CounterState createState() => _CounterState(); } class _CounterState extends State<Counter> { int _counter = 0; void _increment() { setState(() { ++_counter; }); } @override Widget build(BuildContext context) { return RaisedButton( onPressed: _increment, child: Text('$_counter'), ); } } ``` # 巢狀component 在Widget的Build中,如果要使用巢狀的組件,會用到`child`或是`children`,如果這個組件只有一個子組件,就使用`Child`,有一個以上的子組件就使用`children: <Widget>[]` ### child ```java return Center(child: Counter()); ``` ### children ```java return children: <Widget>[ RaisedButton( onPressed: _increment, child: Text('Increment'), ), Text('Count: $_counter'), ], ``` # Props 上層組件傳入的值 #### StatelessWidget 分成兩個步驟: 1. 指定名稱:`TextBox({this.name})` 2. 宣吿變數:`final String name` 外部傳入:`TextBox(name:'jess')` ```java class Home extends StatelessWidget { @override Widget build(BuildContext context) { return Center(child: TextBox(name: 'jess')); } } class TextBox extends StatelessWidget { TextBox({this.name}); final String name; @override Widget build(BuildContext context) { return Text('name : $name'); } } ``` #### StatefulWidget & State 在`State`裡面直接使用`widget[propsName]`,就等於是找到`StatefulWidget`裡的`this[propsName]`。 ```java class App extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( home: GlobalLayout(title: 'flutter_router_demo'), ) } } ``` ```java class GlobalLayout extends StatefulWidget { GlobalLayout({this.title}); final String title; @override GlobalLayoutState createState() => GlobalLayoutState(); } ``` ```java class GlobalLayoutState extends State<GlobalLayout> { //... @override Widget build(BuildContext context) { return Text(widget.title) } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up