flutter自定义InheritedProvider实现状态管理详解

 更新时间:2022年11月14日 16:53:19   作者:李小轰_Rex  
这篇文章主要为大家介绍了flutter自定义InheritedProvider实现状态管理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

InheritedWidget简单数据驱动模型

基于InheritedWidget,实现简单的数据驱动模型,模型结构如下:

1. 数据存储

使用 InheritedWidget,新建 InheritedProvider

import 'package:flutter/material.dart';
class InheritedProvider<T> extends InheritedWidget {
  final T data;
  InheritedProvider({@required this.data, Widget child}) : super(child: child);
  @override
  bool updateShouldNotify(InheritedProvider<T> oldWidget) {
    //在此简单返回true,则每次更新都会调用依赖其的子孙节点的 didChangeDependencies
    return true;
  }
}

2. 变更通知

使用flutter自带的 ChangeNotifier 组件,封装工具类 ChangeNotifierProvider 用于响应数据变更,触发UI更新。

class ChangeNotifierProvider<T extends ChangeNotifier> extends StatefulWidget {
  final Widget child;
  final T data; //共享的数据模型,要求继承ChangeNotifier
  const ChangeNotifierProvider({
    Key key,
    this.child,
    this.data,
  }) : super(key: key);
  ///提供方法,子树获取共享数据
  static T of<T>(BuildContext context) {
    final provider =
        context.dependOnInheritedWidgetOfExactType<InheritedProvider<T>>();
    return provider.data;
  }
  @override
  _ChangeNotifierProviderState createState() =>
      _ChangeNotifierProviderState<T>();
}
class _ChangeNotifierProviderState<T extends ChangeNotifier>
    extends State<ChangeNotifierProvider<T>> {
  ///如果数据发生变化(model类调用 notifyListeners),重新构建InheritedProvider
  void update() {
    setState(() => {});
  }
  @override
  void didUpdateWidget(ChangeNotifierProvider<T> oldWidget) {
    ///当Provider更新时,如果新旧数据不"==",则解绑旧数据监听,同时添加新数据监听
    if (widget.data != oldWidget.data) {
      oldWidget.data.removeListener(update);
      widget.data.addListener(update);
    }
    super.didUpdateWidget(oldWidget);
  }
  @override
  void initState() {
    widget.data.addListener(update);
    super.initState();
  }
  @override
  void dispose() {
    widget.data.removeListener(update);
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return InheritedProvider<T>(
      data: widget.data,
      child: widget.child,
    );
  }
}

原理:使用InheritedWidget作为父节点,当数据源更新时,数据模型经过ChangeNotifier的关联,触发 _ChangeNotifierProviderState 的 setState方法,刷新UI。

封装 NotifyConsumer 直接显式调用 ChangeNotifierProvider.of 获取共享数据语义不明确,我们将其做一层简单的封装用于子节点获取数据:

///响应数据变化的消费者
class NotifyConsumer<T> extends StatelessWidget {
  final Widget Function(BuildContext context, T value) builder;
  const NotifyConsumer({Key key, @required this.builder}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return builder(
      context,
      ChangeNotifierProvider.of<T>(context),
    );
  }
}

3. 使用方法

创建一个共享数据模型:

///共享数据模型
class CountModel extends ChangeNotifier {
  int _count = 0;
  int get count => _count;
  //提供自增方法
  void increase() {
    _count++;
    // 通知监听器(订阅者),重新构建InheritedProvider, 更新状态。
    notifyListeners();
  }
}

ChangeNotifierProvider 的使用方式:

import 'package:flutter/material.dart';
import 'package:test_interited/provider/change_notifier_provider.dart';
import 'package:test_interited/provider/notify_consumer.dart';
import 'package:test_interited/provider/test/count_model.dart';
class TestNotifierWidget extends StatefulWidget {
  const TestNotifierWidget({Key key}) : super(key: key);
  @override
  _TestNotifierWidgetState createState() => _TestNotifierWidgetState();
}
class _TestNotifierWidgetState extends State<TestNotifierWidget> {
  @override
  Widget build(BuildContext context) {
    return Center(
        child: ChangeNotifierProvider<CountModel>(
            data: CountModel(),
            child: Builder(builder: (context) {
              return Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  Builder(
                    builder: (context) {
                      //获取共享数据源
                      return NotifyConsumer<CountModel>(
                          builder: (context, value) {
                        return Text(value.count.toString());
                      });
                    },
                  ),
                  Builder(builder: (context) {
                    return RaisedButton(
                      child: Text('自增'),
                      onPressed: () {
                        //获取共享model,进行数据自增操作
                        ChangeNotifierProvider.of<CountModel>(context).increase();
                      },
                    );
                  }),
                ],
              );
            })));
  }
}

以上就是flutter自定义InheritedProvider实现状态管理详解的详细内容,更多关于flutter自定义InheritedProvider的资料请关注脚本之家其它相关文章!

相关文章

  • Android如何在原生App中嵌入Flutter

    Android如何在原生App中嵌入Flutter

    这篇文章主要介绍了Android如何在原生App中嵌入Flutter,帮助大家更好的理解和学习Android开发,感兴趣的朋友可以了解下
    2021-03-03
  • Android实现动态改变shape.xml中图形的颜色

    Android实现动态改变shape.xml中图形的颜色

    这篇文章主要介绍了Android实现动态改变shape.xml中图形的颜色,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Android布局之TableLayout表格布局

    Android布局之TableLayout表格布局

    Tablelayout类以行和列的形式对控件进行管理,每一行为一个TableRow对象,或一个View控件。当为TableRow对象时,可在TableRow下添加子控件,默认情况下,每个子控件占据一列。 当为View时,该View将独占一行
    2015-12-12
  • Android App获取屏幕旋转角度的方法

    Android App获取屏幕旋转角度的方法

    这篇文章主要为大家详细介绍了Android App获取屏幕旋转角度,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • Android身份证号有效性校验工具类案例

    Android身份证号有效性校验工具类案例

    这篇文章主要介绍了Android身份证号有效性校验工具类案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Ubuntu 14.04下创建Genymotion安卓虚拟机的步骤详解

    Ubuntu 14.04下创建Genymotion安卓虚拟机的步骤详解

    Android 模拟器一直以速度奇慢无比著称,基本慢到不可用。本文介绍我一直在用的 Genymotion,速度不亚于真机。而且功能齐全,使用简单。下面这篇文章主要介绍了Ubuntu 14.04下创建Genymotion虚拟机的步骤,需要的朋友可以参考下。
    2017-03-03
  • Android仿微信实现评论功能

    Android仿微信实现评论功能

    这篇文章主要为大家详细介绍了Android仿微信实现评论功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • Android开发之TableLayout表格布局

    Android开发之TableLayout表格布局

    这篇文章主要为大家详细介绍了Android开发之TableLayout表格布局,表格布局模型是以行列的形式管理子控件,对TableLayout表格布局感兴趣的小伙伴们可以参考一下
    2016-03-03
  • Android应用借助LinearLayout实现垂直水平居中布局

    Android应用借助LinearLayout实现垂直水平居中布局

    这篇文章主要介绍了Android应用借助LinearLayout实现垂直水平居中布局的方法,文中列举了LinearLayout线性布局下居中相关的几个重要参数,需要的朋友可以参考下
    2016-04-04
  • Android 实现滑动方法总结

    Android 实现滑动方法总结

    这篇文章主要介绍了Android 实现滑动方法总结的相关资料,需要的朋友可以参考下
    2017-07-07

最新评论