美文网首页
flutter数据传递组件InheritedModel/Inhe

flutter数据传递组件InheritedModel/Inhe

作者: 一叠纸船 | 来源:发表于2020-08-18 06:54 被阅读0次

InheritedModel是一个功能性的基础组件,功能非常强大,可以做到##数据从父节点到子孙节点跨层级间传递##, 即如下图展示的传递:


inherited_widget.png

衍生出来的几个状态管理的工具,基本都是通过它来实现的。今天避免写的过于复杂,仅仅展示一下它最基础的用法,见微知著。方便我们更高效的开发,更深入的学习。

首先,看一下InheritedModel最简单的定义示例:

import 'package:flutter/material.dart';

class InheritedColor extends InheritedModel {
  final Color firstColor; 
  InheritedColor({this.firstColor, Widget child}): super(child: child);

  @override
  bool updateShouldNotify(InheritedColor oldWidget) {
    return true;
  }
  
  @override
  bool updateShouldNotifyDependent(InheritedColor oldWidget, Set dependencies) {
    return true;
  }
}

这个firstColor是自定义的,可以是任何属性。

接下来是##main.dart##文件的改动, 重点就是build方法下的:InheritedColor在最外层包裹(wrapper)。

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return InheritedColor(
      firstColor: Colors.red,
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: MyHomePage(title: 'Flutter Demo Home Page'),
      )
    );
  }
}

在任意页面都可以获取到InheritedColor里的firstColor属性,及使用##context.dependOnInheritedWidgetOfExactType<InheritedColor>().firstColo##r获取到的,示例如下:

import 'package:flutter/material.dart';
import 'package:week_widget/InheritedWidgets/InheritedColor.dart';

class InheritedWidgetsScreen extends StatefulWidget {
  InheritedWidgetsScreen({Key key}) : super(key: key);

  @override
  _InheritedWidgetsScreenState createState() => _InheritedWidgetsScreenState();
}

class _InheritedWidgetsScreenState extends State<InheritedWidgetsScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
       appBar: AppBar(title: Text('InheritedWidgetsScreen')),
       body: Container(
         alignment: Alignment.center,
         child: Text(
           'demo',
           style: TextStyle(
             color: context.dependOnInheritedWidgetOfExactType<InheritedColor>().firstColor
           ),
         ),
       ),
    );
  }
}

效果图如下:


inherited_widget_screen.jpg

以上就完成了最简单的InheritedModel的使用。虽然用法简单,但是确实功能强大,也为开发强大的状态管理工具提供根本的支持。
常用的全局主题(theme)就是基于InheritedModel实现的,我们日常调用的#Theme.of(context).primaryColor#这种方法,我们增加一个静态方法,InheritedColor实现也是可以做到的。
InheritedColor修改后的代码是:

import 'package:flutter/material.dart';

class InheritedColor extends InheritedModel {
  final Color firstColor;

  InheritedColor({this.firstColor, Widget child}): super(child: child);

  @override
  bool updateShouldNotify(InheritedColor oldWidget) {
    return true;
  }
  
  @override
  bool updateShouldNotifyDependent(InheritedColor oldWidget, Set dependencies) {
    return true;
  }

  static InheritedColor of(BuildContext context)=> context.dependOnInheritedWidgetOfExactType<InheritedColor>(); //即添加这一个静态方法实现的
}

在InheritedWidgetsScreen实现中,就可以把 #context.dependOnInheritedWidgetOfExactType<InheritedColor>().firstColor#替换成#InheritedColor.of(context).firstColor#获取到对应的值了。

InheritedModel作为一个功能性的组件,对于理解状态管理非常重要,这一篇文章展示不再做延伸。稍晚一点,会陆续更新状态管理的文章。

InheritedModel继承自InheritedWidget,这篇文章只涉及基础用法,InheritedModel和InheritedWidget的使用几乎是一样的。稍晚一点会写一篇文章说一下InheritedModel的特殊用法。

这个系列的文章是根据flutter 的 Widget of the week来做的,欢迎大家斧正。

相关文章

  • flutter数据传递组件InheritedModel/Inhe

    InheritedModel是一个功能性的基础组件,功能非常强大,可以做到##数据从父节点到子孙节点跨层级间传递#...

  • vue $attrs 和$listener

    $attrs $attrs--继承所有的父组件属性(除了prop传递的属性、class 和 style )inhe...

  • InheritedModel / InheritedWidget

    https://flutter.institute/sharing-data-inheritedmodel-vs-...

  • Flutter跨组建传递数据的三种方式

    背景:flutter组件嵌套都很深,依次传递数据很麻烦,所以最好是能够跨组件传递。有三张跨组件的方式:Inheri...

  • Flutter Provider

    InheritedWidget 组件是功能型组件,提供了沿树向下,共享数据的功能,即子组件可以获取父组件(Inhe...

  • Flutter 通知中心

    Flutter关于Notification,没什么可说的,可以实现将数据从子组件向父组件传递。 但是如果要是实现多...

  • Flutter -- 跨组件传递数据

    方式数据流动方式使用场景优缺点属性传值父到子简单数据传递传值简单,但跨多个父子节点不方便InheritedWidg...

  • vue父子组件以及非父子组件的通信

    1.父组件传递数据给子组件 通过props传递数据 2.子组件传递数据给父组件 通过$emit传递父组件数据 子组...

  • Vue中组件间传值总结 ------ 2020-05-17

    父子组件间传递数据的方式 1、父组件向子组件传递数据 2、子组件向父组件传递数据 3、父子组件相互传递同一数据的两...

  • Vue 组件数据传递

    Vue 组件数据传递 父组件->子组件 父组件到子组件的数据通过 props 传递 在父组件注册子组件,传递数据到...

网友评论

      本文标题:flutter数据传递组件InheritedModel/Inhe

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