美文网首页
状态管理(provide)

状态管理(provide)

作者: wangyu2488 | 来源:发表于2020-01-19 09:16 被阅读0次

    https://github.com/google/flutter-provide

    image.png

    注意

    1.状态修改 都要用 R刷新

    2.状态管理主要是做左右数据联动,或者不同页面数据共享之类的

    1.stateful要全部写在一起,不利于组件化,简单的可以

    setState(() {
      list = category.data;
    });
    
    

    2.provide比较好用

    2019年7月31日

    一.provide实现状态管理

    1.效果:

    image.gif

    2.实现

    2.1创建状态管理类

    import 'package:flutter/material.dart';
    class Counter with ChangeNotifier {
      int value = 0;
      increment() {
        value++;
        notifyListeners();
      }
    }
    

    2.2main里面注册

    import 'package:flutter/material.dart’;
    import 'package:provide/provide.dart';
    import './provide/counter.dart';
    void main() {
      var providers = Providers();
      var counter = Counter();
      providers..provide(Provider<Counter>.value(counter));
      runApp(ProviderNode(child: MyApp(), providers: providers));
    }
    
    

    3.3显示和调用地方

    mport 'package:flutter/material.dart';
    import 'package:provide/provide.dart';
    import '../provide/counter.dart';
    class CartPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              children: <Widget>[
                Number(),
                MyButton(),
              ],
            ),
          ),
        );
      }
    }
    class Number extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          margin: EdgeInsets.only(top: 200),
          child: Provide<Counter>(
            builder: (context, child, val) {
              return Text(
                ‘${val.value}',
                style: Theme.of(context).textTheme.display1,
              );
            },
          ),
        );
      }
    }
    class MyButton extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Container(
          child: RaisedButton(
            onPressed: () {
              Provide.value<Counter>(context).increment();
            },
            child: Text('递增'),
          ),
        );
      }
    }
    
    //另外一种取法
    isClick = (index == Provide.value<ChildCategoryP>(context).childIndex)
    
    

    注意上面的

    builder里面的val相当于下面的这个对象

    Provide.value<ChildCategoryP>(context)
    

    二.同一个页面多个数据状态管理

    import 'package:flutter/material.dart';
    import '../model/categoryM.dart';
    class ChildCategoryP with ChangeNotifier {
      List<BxMallSubDto> childCategoryList = [];
      int childIndex = 0; //子类高亮所以
      String categoryId = '4'; //大类的id(默认是白酒)
      String subId = ''; //小类id
      int page = 1; //列表也页数
      String noMoreText = ''; //显示没有数据的文字
      setChildCategory(List<BxMallSubDto> list, String categoryId) {
        //添加一个默认全部
        BxMallSubDto all = BxMallSubDto();
        all.mallSubId = '';
        all.mallCategoryId = '00';
        all.mallSubName = '全部';
        all.comments = 'null';
        childCategoryList = [all];
        childCategoryList.addAll(list);
        childIndex = 0;
        categoryId = categoryId;
        page = 1;
        noMoreText = '';
        notifyListeners();
      }
    //改变子类索引
      changeChildIndex(index, String subId) {
        childIndex = index;
        subId = subId;
        page = 1;
        noMoreText = '';
        notifyListeners();
      }
      //增加page的方法
      addPage() {
        page++;
      }
      //改变
      changeNoMore(String text) {
        noMoreText = text;
        notifyListeners();
      }
    }
    
    

    三.业务和显示逻辑分离开发

    import 'package:flutter/material.dart';
    import 'package:provide/provide.dart';
    import '../provide/details_infoP.dart';
    class DetailsPage extends StatelessWidget {
      final String goodsId;
      DetailsPage(this.goodsId);
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            leading: IconButton(
              icon: Icon(Icons.arrow_back_ios),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
            title: Text('detail page'),
          ),
          body: FutureBuilder(
            future: reqGoodsInfo(context),
            builder: (context, snapshot) {
              if (snapshot.hasData) {
                return Container(
                  child: Column(
                    children: <Widget>[
                      Text('shopId:$goodsId'),
                    ],
                  ),
                );
              } else {
                return Text('loading');
              }
            },
          ),
        );
      }
      Future reqGoodsInfo(BuildContext context) async {
        await Provide.value<DetailsInfoProvide>(context).reqGoodsInfo(goodsId);
        return 'finish load';
      }
    }
    
    
    import 'package:flutter/material.dart';
    import '../model/detailsM.dart';
    import '../service/service_method.dart';
    import 'dart:convert';
    class DetailsInfoProvide with ChangeNotifier {
      DetailsModel goodsInfo;
      //从后台获取商品数据
      reqGoodsInfo(String id) {
        var formData = {
          'goodId': id,
        };
        request('getGoodsDetailById', formData: formData).then((val) {
          var responseData = json.decode(val.toString());
          print(responseData);
          goodsInfo = DetailsModel.fromJson(responseData);
          notifyListeners();
        });
      }
    }
    
    

    相关文章

      网友评论

          本文标题:状态管理(provide)

          本文链接:https://www.haomeiwen.com/subject/epxrzctx.html