状态管理-InheritedWidget

2021-11-23  本文已影响0人  Jean_Lina

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
上一篇下一篇

猜你喜欢

热点阅读