美文网首页
状态管理-InheritedWidget

状态管理-InheritedWidget

作者: Jean_Lina | 来源:发表于2021-11-23 17:51 被阅读0次

    1 短时状态

    一些状态只需要在自己的Widget中进行使用,Widget树中的其它部分不需要访问这个状态,使用StatefulWidget对应State类进行管理

    2 应用状态:一些状态需要在多个组件进行共享

    用户的登录信息
    消息状态展示


    state.jpg

    (1)InheritedWidget

    import 'package:flutter/material.dart';
    /// InheritedWidget 管理共享数据
    class DBJCounterWidget extends InheritedWidget {
      /// 共享数据
      final int? counter;
    
      /// 构造方法
      DBJCounterWidget({required Widget child, this.counter}) : super(child: child);
    
      /// 沿着Element树去找到最近的DBJCounterElement,从Element中取出widget对象
      static DBJCounterWidget? of(BuildContext context) {
        return context.dependOnInheritedWidgetOfExactType();
      }
    
      /// 对比新旧DBJCounterWidget,是否需要对更新相关依赖的Widget中对应State的didChangeDependencies方法
      @override
      bool updateShouldNotify(covariant DBJCounterWidget oldWidget) {
        return counter != oldWidget.counter;
      }
    }
    
    
     dependOnInheritedWidgetOfExactType底层代码实现
    
     @override
      T? dependOnInheritedWidgetOfExactType<T extends InheritedWidget>({Object? aspect}) {
        assert(_debugCheckStateIsActiveForAncestorLookup());
        final InheritedElement? ancestor = _inheritedWidgets == null ? null : _inheritedWidgets![T];
        if (ancestor != null) {
          return dependOnInheritedElement(ancestor, aspect: aspect) as T;
        }
        _hadUnsatisfiedDependencies = true;
        return null;
      }
    
      @override
      InheritedWidget dependOnInheritedElement(InheritedElement ancestor, { Object? aspect }) {
        assert(ancestor != null);
        _dependencies ??= HashSet<InheritedElement>();
        _dependencies!.add(ancestor);
        ancestor.updateDependencies(this, aspect);
        return ancestor.widget;
      }
    
    使用方式:
    class _DBJHomeBodyWidgetState extends State<DBJHomeBodyWidget> {
      /// 多Widget共享数据
      int counter = 200;
    
      @override
      Widget build(BuildContext context) {
        print('_DBJHomeBodyWidgetState 执行build');
        return Scaffold(
          appBar: AppBar(
            title: Text('状态管理-Inherited'),
          ),
          body: DBJCounterWidget(
            counter: counter,
            child: Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  DBJGoodsInfo(), //依赖数据展示
                  SizedBox(height: 30),
                  DBJShopCarInfo(), //依赖数据展示
                ],
              ),
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              print('点击++');
              setState(() {
                // 修改共享数据
                counter++; 
              });
            },
            child: Icon(Icons.add),
          ),
        );
      }
    }
    
    多模块调用方式:DBJCounterWidget.of(context)?.counter;
     @override
      Widget build(BuildContext context) {
        print('商品信息 执行build');
        int? number = DBJCounterWidget.of(context)?.counter;
        return Card(
          child: Text(
            '商品信息:$number',
            style: TextStyle(fontSize: 18, color: Colors.red),
          ),
        );
      }
    
    截屏2021-11-23 下午7.46.45.png
    Simulator Screen Shot - iPhone 11 - 2021-11-23 at 19.58.25.png 截屏2021-11-23 下午7.58.43.png

    相关文章

      网友评论

          本文标题:状态管理-InheritedWidget

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