日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Flutter Provider局部刷新

發(fā)布時間:2024/3/24 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Flutter Provider局部刷新 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.添加Provider依賴

dependencies:provider: ^4.0.4flutter:sdk: flutter

最新版本https://pub.dev/packages/provider

2.創(chuàng)建ProviderModel

class FirstProviderModel extends ChangeNotifier{int _count = 0;int get count => _count;void add() {_count++;print('$_count');notifyListeners();} }

這是一個計數(shù)案例,_count屬于私有化只能通過count調(diào)用、add是增加數(shù)值方法。

3.使用前需要注冊ProviderModel
(1)單頁面使用注冊

///用來配置頁面中的Provider ///僅當前頁面使用 class FirstProviderStateless extends StatelessWidget{@overrideWidget build(BuildContext context) {return MultiProvider(providers: [ChangeNotifierProvider(create: (_)=>FirstProviderModel()),],child: FirstProvider(),);} }

(2)多頁面使用注冊(在main.dart中)

///MultiProvider配置在main里面才可以在頁面之間通用 ///配置在單個頁面當中 數(shù)據(jù)不會刷新 main() {runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (_)=>FirstProviderModel())],child: MyApp(),)); }class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn MaterialApp(home: FirstProvider(),);} }

兩者區(qū)別:
單頁面使用僅僅只是為了局部刷新使用。
多頁面使用注冊是為了多個頁面改變值使用(例如A和B兩個頁面,a頁面負責展示值 b頁面既展示又要去修改這個值,這時在b頁面修改值之后也會通知a頁面的值進行改變)

4.注冊完成之后如何局部刷新
想要達到局部刷新效果需要將要刷新的控件放在Consumer當中代碼展示如下

class FirstProvider extends StatefulWidget{@overrideState<StatefulWidget> createState() {return FirstProviderState();} }class FirstProviderState extends State<FirstProvider>{///刷新次數(shù)記錄var _refreshTime = 0;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('FirstProvider')),body: getColumn(),floatingActionButton: FloatingActionButton(onPressed: (){//這句是為了修改model當中的值 當前直接進行修改值。Provider.of<FirstProviderModel>(context,listen: false).add();//這句是為了跳轉(zhuǎn)下一個頁面 完善兩個頁面共用一個值的需求。//Navigator.push(context, MaterialPageRoute(builder: (context) => SecondProvider()));},child: Icon(Icons.navigate_next),),);}getColumn(){_refreshTime ++;return Column(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,mainAxisSize: MainAxisSize.max,children: [///包裹在Consumer中 才可以局部刷新這塊Consumer<FirstProviderModel>(builder: (context, counter, child) => Text('同步second頁面值:${counter.count}',),),///為了證明這里沒刷新 刷新的話數(shù)值增加Container(alignment: Alignment.topCenter,child: Text('記錄當前頁面刷新次數(shù):${_refreshTime}'),)],);}

如上代碼可以看出就需要局部刷新控件是放在Consumer當中,_refreshTime是為了標記在局部刷新時沒有刷新其他控件。
counter相當于是最開始創(chuàng)建的ProviderModel

floatingActionButton跳轉(zhuǎn)的是可點擊增加計數(shù)的頁面SecondProvider

class SecondProvider extends StatefulWidget{@overrideState<StatefulWidget> createState() {return SecondProviderState();} }class SecondProviderState extends State<SecondProvider>{@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SecondProvider')),body: Center(child: Text('同步First頁面值:${Provider.of<FirstProviderModel>(context).count}'),),floatingActionButton: FloatingActionButton(onPressed: (){Provider.of<FirstProviderModel>(context,listen: false).add();},child: Icon(Icons.add),),);}}

通過Provider.of<FirstProviderModel>(context,listen: false).add();對model當中的數(shù)值進行修改。

完成代碼
main.dart頁面

///MultiProvider配置在main里面才可以在頁面之間通用 ///配置在單個頁面當中 數(shù)據(jù)不會刷新 main() {runApp(MultiProvider(providers: [ChangeNotifierProvider(create: (_)=>FirstProviderModel())],child: MyApp(),)); }class MyApp extends StatelessWidget {@overrideWidget build(BuildContext context) {// TODO: implement buildreturn MaterialApp(home: FirstProvider(),);} }

FirstProvider

///用來配置頁面中的Provider ///僅當前頁面使用 class FirstProviderStateless extends StatelessWidget{@overrideWidget build(BuildContext context) {return MultiProvider(providers: [ChangeNotifierProvider(create: (_)=>FirstProviderModel()),],child: FirstProvider(),);} }class FirstProvider extends StatefulWidget{@overrideState<StatefulWidget> createState() {return FirstProviderState();} }class FirstProviderState extends State<FirstProvider>{///刷新次數(shù)記錄var _refreshTime = 0;@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('FirstProvider')),body: getColumn(),floatingActionButton: FloatingActionButton(onPressed: (){Navigator.push(context, MaterialPageRoute(builder: (context) => SecondProvider()));},child: Icon(Icons.navigate_next),),);}getColumn(){_refreshTime ++;return Column(mainAxisAlignment: MainAxisAlignment.center,crossAxisAlignment: CrossAxisAlignment.center,mainAxisSize: MainAxisSize.max,children: [///包裹在Consumer中 才可以局部刷新這塊Consumer<FirstProviderModel>(builder: (context, counter, child) => Text('同步second頁面值:${counter.count}',),),///為了證明這里沒刷新 刷新的話數(shù)值增加Container(alignment: Alignment.topCenter,child: Text('記錄當前頁面刷新次數(shù):${_refreshTime}'),)],);}}

SecondProvider

///用來配置頁面中的Provider ///僅當前頁面使用 class SecondStateless extends StatelessWidget{@overrideWidget build(BuildContext context) {// TODO: implement buildreturn MultiProvider(providers: [ChangeNotifierProvider(create: (_) => FirstProviderModel()),],child: SecondProvider(),);}} class SecondProvider extends StatefulWidget{@overrideState<StatefulWidget> createState() {return SecondProviderState();} }class SecondProviderState extends State<SecondProvider>{@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('SecondProvider')),body: Center(child: Text('同步First頁面值:${Provider.of<FirstProviderModel>(context).count}'),),floatingActionButton: FloatingActionButton(onPressed: (){Provider.of<FirstProviderModel>(context,listen: false).add();},child: Icon(Icons.add),),);}}

以上就是本文全部內(nèi)容,如有錯誤還請大家多多指正。

總結(jié)

以上是生活随笔為你收集整理的Flutter Provider局部刷新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。