这是上篇文章文末提到的「第三个教程」的快速自学笔记。app
读音 /'wɪdʒɪt/
危机特,文档说借鉴了 React。我认为 Widget 至关于 React 里的组件 Component。less
下文将 Widget 所有称为「部件」。ide
部件的特色函数
这是 Flutter 应用必须调用的 API,接受一个部件。我的认为这很像是 React 的 ReactDOM.render 操做。布局
import 'package:flutter/material.dart';
void main() {
runApp(
Center(
child: Text(
'Hello, world!',
textDirection: TextDirection.ltr,
),
),
);
}
复制代码
以上代码的做用:post
经常使用的部件有:flex
若是你想用一些 Material 风格的部件,只须要作这几件事就能够:动画
在 pubspec.yml 里添加以下代码ui
flutter:
uses-material-design: true
复制代码
runApp 的时候使用 MaterialApp,并使用 Material 部件
runApp(MaterialApp(
title: 'My app', // used by the OS task switcher
home: Material(),
));
复制代码
import 'package:flutter/material.dart';
Navigator:相似于 ReactRouter
AppBar:顶部的 bar
AppBar(
leading: IconButton(
icon: Icon(Icons.menu),
tooltip: 'Navigation menu',
onPressed: null,
),
title: Text('Example title'),
actions: <Widget>[
IconButton(
icon: Icon(Icons.search),
tooltip: 'Search',
onPressed: null,
),
],
)
复制代码
Scaffold: 最经常使用的布局部件
Scaffold(
appBar: AppBar(...),
body: Center(...),
floatingActionButton: ...
);
复制代码
这些传参方式很像 Vue 的命名插槽。
这是一个自定义 button 部件:
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector( // <-- 注意看这里
onTap: () {
print('MyButton was tapped!');
},
child: Container(
height: 36.0,
padding: ...,
margin: ...,
decoration: ...,
child: Center(
child: Text('Engage'),
),
),
);
}
}
复制代码
无状态部件从父级接收数据,并把数据存在本身的 final 成员变量里(相似于 JS 的 const)。
有状态的部件则知道如何建立 state 对象,并维持 state 对象。
如何使用呢?
首先声明一个 StatefulWidget
class Counter extends StatefulWidget {
@override
_CounterState createState() => _CounterState();
}
复制代码
这个部件须要重写 createState 方法,而这个方法的返回值的类型,必须继承自 State 类。
_CounterState 是如何继承 State 的呢
class _CounterState extends State<Counter> {
int _counter = 0;
void _increment() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
RaisedButton(
onPressed: _increment,
child: Text('Increment'),
),
Text('Count: $_counter'),
],
);
}
}
复制代码
'$_counter'
混入语法_increment
,这个 _increment
会调用 State 提供的 setState 函数,给 setState 函数传入一个函数,这个传入的函数能够对数据进行修改。StatefulWidget 有 createState 方法,State 有 initState 方法。
Flutter 调用 createState 方法后,获得一个 State 对象,而后调用这个 State 对象的 initState 方法。
你的自定义 State 类能够重写 initState 方法,这个方法只会调用一次。好比你能够重写 initState 来配置动画或者订阅事件。
当一个 State 对象快死的时候,Flutter 会调用 State 对象的 dispose 方法。你也能够重写 dispose 方法,好比在里面取消 timer 或者取消订阅。
Flutter 默认是经过部件的 runtimeType 和出现顺序来肯定一个部件的身份的,这样才能在对比新旧部件树的过程当中肯定哪一个是哪一个。若是你给部件赋予了 key,那么就不用根据「出现顺序」来惟一肯定组件了,由于这种方式不太靠谱。
我的认为跟 React 的 key 有相同的做用。
key 分为兄弟间的 key 和全局 key。目前还不知道应用场景的区别。大部分时候应该只须要用兄弟间的 key 用来区分兄弟就好了。
下一篇文章打算看看 Flutter 如何发起网络请求。
未完待续……