Flutter 全局状态管理 redux & scoped_model

本文探讨了Flutter应用中使用redux和scoped_model进行全局状态管理的方法,包括如何实现flutter_redux和scoped_model的集成及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flutter 全局状态管理 redux & scoped_model

flutter_redux


// One simple action: Increment
enum Actions {
Increment
}

// The reducer, which takes the previous count and increments it in response
// to an Increment action.
int counterReducer(int state,dynamic action){
if(action == Actions.Increment){
 return state +1;
}
return state;
}

void main(){
// Create your store as a final variable in a base Widget. This works better
// with Hot Reload than creating it directly in the `build` function.
final store = new Store<int>(counterReducer,initialState: 0);

runApp(new FlutterReduxApp(
 title: 'Flutter Redux App',
 store: store,
));
}

class FlutterReduxApp extends StatelessWidget {
final String title;
final Store<int> store;
FlutterReduxApp({Key key,this.store,this.title}):super(key:key);

@override
Widget build(BuildContext context) {
 // The StoreProvider should wrap your MaterialApp or WidgetsApp. This will
 // ensure all routes have access to the store.
 return StoreProvider<int>(
   store: store,
   child: new MaterialApp(
     theme: new ThemeData.dark(),
     title: title,
     home: ScaffoldDemo(title,store),
   ),
 );
}
}


class ScaffoldDemo extends StatelessWidget {
final String title;
final Store<int> store;
ScaffoldDemo(this.title,this.store);



@override
Widget build(BuildContext context) {
 return Scaffold(
   appBar: AppBar(title: Text(title),),
   body: Center(
     child: Column(
       children: <Widget>[
         Text('you have click the button many times:'),
         StoreConnector<int,String>(
           converter: (store)=>store.state.toString(),
           builder: (context,count){
             return Text(
               count,
               style: Theme.of(context).textTheme.display1,
             );
           },
         )
       ],
     ),
   ),
   floatingActionButton: new StoreConnector<int, VoidCallback>(
     converter: (store) {
       // Return a `VoidCallback`, which is a fancy name for a function
       // with no parameters. It only dispatches an Increment action.
       return () => store.dispatch(Actions.Increment);
     },
     builder: (context, callback) {
       return new FloatingActionButton(
         // Attach the `callback` to the `onPressed` attribute
         onPressed: callback,
         tooltip: 'Increment',
         child: new Icon(Icons.add),
       );
     },
   ),
 );
}
}

scoped_model

void main(){
runApp(MyApp(
 model:CounterModel(),
));
}

class MyApp extends StatelessWidget {
final CounterModel model;
MyApp({Key key,@required this.model}):super(key:key);

@override
Widget build(BuildContext context) {
 return ScopedModel(
   model: model,
   child: MaterialApp(
     title: 'Scoped Model Demo',
     home: CountPage(),
   ),
 );
}
}

class CountPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
 return Scaffold(
   appBar: AppBar(
     title: Text('Scoped Model'),
     actions: <Widget>[
       IconButton(
         tooltip: 'to result',
         icon: Icon(Icons.home),
         onPressed: (){
           Navigator.push(context, MaterialPageRoute(builder: (context)=>ResultPage()));
         },
       )
     ],
   ),
   body: Center(
     child: Column(
       mainAxisAlignment: MainAxisAlignment.center,
       children: <Widget>[
         Text('你都点击'),
         ScopedModelDescendant<CounterModel>(
           builder: (context,child,model){
             return Text('${model.counter.toString()}次了',
               style: TextStyle(
                 color: Colors.red,
                 fontSize: 33.0
               ),
             );
           },
         )
       ],
     ),
   ),
   floatingActionButton: ScopedModelDescendant<CounterModel>(
     builder: (context,child,model){
       return FloatingActionButton(
         onPressed: model.increment,
         tooltip: 'add',
         child: Icon(Icons.add),
       );
     }
   ),
 );
}
}

class ResultPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
 return Scaffold(
   appBar: AppBar(title: Text('结果页面'),),
   body: Column(
     mainAxisAlignment: MainAxisAlignment.center,
     crossAxisAlignment: CrossAxisAlignment.center,
     children: <Widget>[
       Text('共享的state:'),
       ScopedModelDescendant<CounterModel>(
         builder: (context,child,model){
           return Text('${model.counter.toString()}',
             style: TextStyle(
                 color: Colors.red,
                 fontSize: 33.0
             ),
           );
         },
       )
     ],
   ),
 );
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值