flutter状态管理之scoped_model

场景:有两个widget A,B, 这两个widget共用一些数据,比如用户名...

实现:

1. 添加依赖

scoped_model: ^1.0.1

2. 定义Model的派生类,如UserModel

//user_model.dart
import 'package:scoped_model/scoped_model.dart';

class UserModel extends Model{
  String _user;

  String get user => _user;
  set user(value) => _user = value;

  bool verify(String username){
    return username == 'Linker';
  }
}

3.  用ScopedModel<Model>包裹MaterialApp

class App extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    return ScopedModel<UserModel>(
      model: UserModel(),
      child: MaterialApp(
        home: Scaffold(
          appBar: AppBar(title: Text('Scoped_model'),),
          body: LoginPage(),
        ),
      ),
    );
  }
}

这样UserModel就可以传给MaterialApp的子widget

4. 用到UserModel的widget用ScopedModelDescendant包裹

//login_page.dart
class LoginPage extends StatelessWidget {
  TextEditingController _userController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
       // mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          TextField(
            controller: _userController,
            decoration: InputDecoration(
              icon: Icon(Icons.verified_user),
              hintText: 'Enter username',
            ),
          ),
          ScopedModelDescendant<UserModel>(
            builder: (BuildContext context, Widget child, UserModel model) {
              return FlatButton(
                child: Text('Login'),
                color: Colors.blue,
                highlightColor: Colors.blue[300],
                onPressed: (){
                  if(model.verify(_userController.text)){
                    model.user = _userController.text;
                    Navigator.of(context).push(MaterialPageRoute(
                      builder: (context){
                        return UserInfoPage();
                      }
                    ));
                  }
                },
              );
            },
          ),
        ],
      ),
    );
  }
}
//userinfo_page
class UserInfoPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      child: Center(
        child: ScopedModelDescendant<UserModel>(
          builder: (BuildContext context, Widget child, UserModel model) {
            return Text('Username: ${model.user}', style: Theme.of(context).textTheme.display1,);
          },
        ),
      ),
    );
  }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值