Flutter provider的简单使用(二)

大家好,我是学习Flutter好几个月的三须鳗鱼 张信哲 ,熟练使用CV大法。

上集说到,provider在MyApp()中使用,这种是全局的。

状态变更只能是全局的话,意义就很小了,所以,这一集主要记状态的局部变更,也就是MVP的实现

provider 的局部更新不能直接使用context.read,或者context.watch,会报一个context没关联的错,实际上应该使用Consumer

这里做了详细说明掘金大佬 JarvanMo:Flutter状态管理:Provider4 入门教程(一)

举个栗子:
body: Consumer<MyChangeNotifier>(
          builder: (_, localNotifier, __) => Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '${localNotifier.counter}',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
        ),

使用上述代码中的localNotifier来替代 Provider.of<T>(context)

比如:

///之前的写法
	Text(
       '${Provider.of<MyChangeNotifier>(context).counter}',
       style: Theme.of(context).textTheme.headline4,
    ),
///现在的写法
	Text(
       '${localNotifier.counter}',
       style: Theme.of(context).textTheme.headline4,
    ),

可以把providers的引入放在Scaffold上,实现一个页面一个Notifier的管理,或者具体控件具体实现

上一下我的代码(功能为获取订单数据,刷新列表)
Bean:

import 'package:xxx/generated/json/base/json_convert_content.dart';

class OrderInfoReqEntity with JsonConvert<OrderInfoReqEntity> {
	String info;
	int pageNo;
	int pageSize;
	int status;
}

page

import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:provider/provider.dart';
import 'package:scoped_model/scoped_model.dart';
import 'package:xxx/data/GlobalScopeModel.dart';
import 'package:xxx/generated/reqentity/order/order_info_req_entity.dart';
import 'package:xxx/generated/retentity/order/order_info_ret_entity.dart';
import 'package:xxx/provider/notifier/order_notifier.dart';
import 'package:xxx/routes/routers.dart';
import 'package:xxx/uitls/CommonUtil.dart';

class OrderMainPage extends StatefulWidget {
  @override
  _OrderMainPageState createState() {
    return new _OrderMainPageState();
  }
}

class _OrderMainPageState extends State<OrderMainPage>  with SingleTickerProviderStateMixin{
 ///尺寸放大倍数
  double times = 1.0;
  TabController _tabController;
  @override
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  void initState() {
    super.initState();
    _tabController = new TabController(vsync: this, length: 3);
  }

  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
  }

  @override
  Widget build(BuildContext contexts) {
    times = ScopedModel.of<GlobalScopeModel>(contexts, rebuildOnChange: true)
        .getSizeTimes();
    times = times == null ? 1.0 : times;
    return new MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => Order()),
      ],
      child: Consumer<Order>(
        builder: (_,_notifier,__)=> Scaffold(
          appBar: AppBar(
            backgroundColor: Colors.white,
            title: new Text("订单中心",style: TextStyle(fontSize:  ScreenUtil().setSp(CommonUtil.sizeTrans(45, times)),fontWeight: FontWeight.bold , color: Colors.black),),
            actions: <Widget>[
              Builder(builder: (contexts){
                return Container(
                  margin: EdgeInsets.only(right: 10),
                  child: FlatButton.icon(
                    icon: Icon(Icons.view_list,color: Colors.red,),
                    highlightColor: Colors.white,
                    label: Text('历史订单',style: TextStyle(fontSize:  ScreenUtil().setSp(CommonUtil.sizeTrans(30, times)),fontWeight: FontWeight.bold , color: Colors.red),),
                    onPressed: (){
                      ///Navigator.pushNamed(context, Routes.orderhistor);
                      _initOrderData(_notifier);  /// 为了方便,触发写在这里
                    },

                  ),
                );
              },
              ),
            ],

            bottom: new TabBar(
              indicatorColor: Colors.blue,
              labelColor: Colors.black,
              ///labelColor: Colors.red,
              tabs: <Widget>[
                new Tab(text:"待处理",),
                new Tab(text:"进行中",),
                new Tab(text:"售后订单",),
              ],
              controller: _tabController,
            ),
          ),
          body:TabBarView(
            controller: _tabController,
            children: <Widget>[
              new Center(
                child: RefreshIndicator(
                  child:ListView.separated(
                    itemCount: (_notifier.newOrderdata.result == null || 
                        _notifier.newOrderdata.result.records==null)?0:
                        _notifier.newOrderdata.result.records.length, 
                        /// 在这里监听变更newOrderdata.result.records 层级深了,多写个判断
                    itemBuilder: (contexts, index) {
                      return waitOrderlistItem(index);
                    },
                    separatorBuilder: (BuildContext contexts, int index) {
                      return Container();
                    },
                  ),
                ),
              ),
              new Center(),
              new Center(),
            ],
          ),
      ),
    ),
  );
}

  Widget waitOrderlistItem(int index) {
    return OederListTemplate(index);
  }

  void _initOrderData(_notifier) {
    OrderInfoReqEntity orderData = OrderInfoReqEntity();
    orderData.pageNo = 1;
    orderData.pageSize = 20;
    _notifier.getAllOrder(orderData, context);  /// 这是触发的方法
  }


}

Notifier

import 'package:flutter/foundation.dart';
/// order
class Order  with ChangeNotifier{

  var _newOrderdata = OrderInfoRetEntity();
  get newOrderdata => _newOrderdata;

  /// 获取全部订单
  Future<void> getAllOrder(OrderInfoReqEntity orderData, BuildContext context) async {
   		/// 获取全部订单数据
  }

  @override
  void debugFillProperties(DiagnosticPropertiesBuilder properties) {
    ///super.debugFillProperties(properties);
    properties.add(ObjectFlagProperty('newOrderdata', newOrderdata));
  }

}

贴一个page代码模板
import 'package:flutter/material.dart';
import 'package:scoped_model/scoped_model.dart';

class $name$ extends StatefulWidget {
  
  @override
  _$name$State createState() => new _$name$State();
}

class _$name$State extends State<$name$> {
 ///尺寸放大倍数
  double times = 1.0;

  @override
  Widget build(BuildContext context) {
    times = ScopedModel.of<GlobalScopeModel>(context, rebuildOnChange: true)
        .getSizeTimes();
    times = times == null ? 1.0 : times;
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(create: (_) => $name$Provider()),
      ],
      child: Consumer<Order>(
        builder: (_,_notifier,__)=> Scaffold(
          appBar: new AppBar(
          title: new Text("$name$"),
          centerTitle:true,
        ),
          body: new ListView(
        ),
      ),
    );
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值