在Flutter中,实现一个功能可以有多种方法。以下是一些常见的实践和模式,它们可以帮助你更好地理解和应用Flutter开发。
- 使用
StatelessWidget
和StatefulWidget
Flutter中的widget可以分为无状态和有状态两种。无状态widget是指在其整个生命周期中,状态不会改变的widget。有状态的widget则是指会随着用户交互或数据更新而改变的widget。
class MyStatelessWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Text('Hello, World!');
}
}
class MyStatefulWidget extends StatefulWidget {
@override
_MyStatefulWidgetState createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
int _counter = 0;
void _incrementCounter() {
setState(() {
_counter++;
});
}
@override
Widget build(BuildContext context) {
return Row(
children: <Widget>[
Text('Count: $_counter'),
RaisedButton(
onPressed: _incrementCounter,
child: Text('Increment'),
),
],
);
}
}
- 使用
StreamBuilder
和FutureBuilder
处理异步数据
这些是处理数据流和未来的控件,可以帮助你在数据加载时显示不同的状态(加载中,加载失败,加载成功)。
StreamBuilder<QuerySnapshot>(
stream: Firestore.instance.collection('items').snapshots(),
builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
if (snapshot.hasError) Text('Error: ${snapshot.error}');
if (snapshot.connectionState == ConnectionState.waiting) Text('Loading...');
return new ListView(
children: snapshot.data.documents.map((doc) => new ListTile(
title: new Text(doc['title']),
)).toList(),
);
},
)
- 使用
InheritedWidget
进行跨层级数据共享
当你需要在widget树的不同层级之间共享数据时,可以使用InheritedWidget
。
class UserInfo extends InheritedWidget {
final String userName;
const UserInfo({Key key, @required this.userName, Widget child})
: super(key: key, child: child);
static String of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<UserInfo>().userName;
}
@override
bool updateShouldNotify(UserInfo old) => userName != old.userName;
}
- 使用
Scoped Model
等状态管理方案
Flutter的状态管理可以帮助你在不同的widget中管理和共享应用程序状态。
class CounterModel extends Model {
int _counter = 0;
int get counter => _counter;
void increme