原文:medium.com/flutterpub/…bash
不是所有翻譯,由於這個老外廢話比較多框架
除了StreamBuilder以外,還有沒有其餘辦法收聽實時數據?ide
最近,Flutter團隊在Google I / O 2019上宣佈了一個名爲Provider的狀態管理軟件包。post
使用方式,添加以下依賴到你的pubspec.yaml文件學習
provider: ^2.0.0+1
複製代碼
在之前,咱們是這樣使用StreamBuilder
來監聽數據的:ui
StreamBuilder(
stream: //YOUR STREAM,
builder: (BuildContext context, AsyncSnapshot snapshot){
return //YOUR CHILD;
})
複製代碼
若是換作provider
的話,是這樣的:this
StreamProvider<LocationModelNormal>.value(
initialData: LocationModelNormal.initialData(),
stream: locationStreamInstance.specificLocation(_secondWonder),
child: SecondStreamWidget(),
),
複製代碼
StreamProvider
的時候,咱們須要指定咱們監聽的對象類型上面例子的LocationModelNormal
代碼以下:url
class LocationModelNormal {
final String name;
final String url;
final GeoPoint coordinates;
final String videoURL;
LocationModelNormal({
this.name,
this.url,
this.coordinates,
this.videoURL,
});
factory LocationModelNormal.fromMap(Map<String, dynamic> data) {
return LocationModelNormal(
name: data['name'] ?? '',
url: data['url'] ?? '',
coordinates: data['location'] ?? null,
videoURL: data['link'] ?? '',
);
}
factory LocationModelNormal.initialData() {
return LocationModelNormal(
coordinates: null,
name: '',
videoURL: '',
url:'',
);
}
}
複製代碼
initialData
在咱們的例子中,咱們傳遞的是LocationModelNormal.initialData()
(代碼在上面)spa
完成了,和StreamBuilder
很類似翻譯
如今咱們寫好了StreamProvider
,咱們須要在child中顯示咱們提供的數據,獲取數據的方式:
var data = Provider.of<LocationModelNormal>(context);
複製代碼
在這個示例裏,咱們學習到若是想要在stream裏獲取咱們想要的數據,使用Provider.of<Type>(context)
在咱們的例子裏,Type = LocationModelNormal
若是須要提供更多的值,可使用MultiProvider
MultiProvider(
providers: [
Provider<Foo>.value(value: foo),
Provider<Bar>.value(value: bar),
Provider<Baz>.value(value: baz),
],
child: someWidget,
)
複製代碼
本文結束
題外話:這些狀態管理,其實沒什麼區別,都是用context.ancestorWidgetOfExactType(type);
相似的方法去查找上層的節點中的數據,如今網上的這些bloc、provide等等,都是這樣,本身寫一個也很容易,能夠看我以前的文章:教你如何實現Flutter的BLoC框架
歡迎加入Flutter開發羣457664582,點擊加入,你們一塊兒學習討論