如何将onTab信号从嵌套的有状态小部件发送到main.dart

时间:2018-11-22 09:18:40

标签: timer dart flutter gesture

在main.dart中,我有一个计时器和GestureDetector。 GestureDetector onTap等使用_handleUserInteraction()处理用户交互。 每次用户使用标签页时,应用都会重置计时器。我的问题是我需要将信号onTab(或类似信号)从 form_a.dart 发送到 home.dart

  • main.dart
  • PageView(带有bottomNavigationBar)( home.dart )(带有计时器)
    • 第1页
      • 第1页摘要(带有ListView)( page_1.dart
      • ListTile 1 onTab
        • ListView A( a.dart
          • FormA( form_a.dart
      • 列出图块2 onTab
      • 列出图块3 onTab
    • 第2页
    • 第3页

如何从嵌套的有状态小部件FormA(** form_a.dart )向home.dart发送onTab信号?**

我需要从home.dart下的任何小部件(尽可能深入地)访问_timer和_handleUserInteraction()函数

package main

import (
    "fmt"
    "time"
)

type UserDetail struct {
    FirstName string
    LastName  string
    Email     string
    User      int
    ReportsTo int
}

type Matter struct {
    ID        int
    Name      string
    Active    bool
    CreatedAt time.Time
    UpdatedAt time.Time
    UserID    int
}

func Testing(model string) interface{} {
    var temp interface{}
    if model == "UserDetail" {
        fmt.Println("Enter for UserDetail...")

        temp = &UserDetail{
            FirstName: "Dev",
            Email: "dev@gmail.com",
        }
    } else if model == "Matter" {
        fmt.Println("Enter for Matter...")

        temp = &Matter{
            Name: "Joe",
            Active: true,
            CreatedAt: time.Now(),
        }
    }

    return temp
}

func main() {
    var temp interface{}
    temp = Testing("UserDetail")
    fmt.Println(temp) // {"Dev", "", "dev@gmail.com", 0, 0}

    temp = Testing("Matter")
    fmt.Println(temp) // {0, "Joe", true, current timestamp, default timestamp, 0}
}

1 个答案:

答案 0 :(得分:2)

一种实现此目的的方法是使用InheritedWidget的功能。

首先创建您的InheritedWidget

class MyInheritedWidget extends InheritedWidget {
  const MyInheritedWidget({
    Key key,
    VoidCallBack handleOnTap,
    Widget child,
  }) : assert(color != null),
       assert(child != null),
       super(key: key, child: child);

  final VoidCallBack handleOnTap;

  static MyInheritedWidget of(BuildContext context) {
    return context.inheritFromWidgetOfExactType(MyInheritedWidget);
  }

  @override
  bool updateShouldNotify(MyInheritedWidget old) => handleOnTap != old.handleOnTap;
}

该小部件对于检索子小部件及其层次结构中的父小部件之间的公共数据很有用。

在主文件中,创建与VoidCallBack签名匹配的处理程序(或根据需要更改签名)。

void _handleUserInteraction() {
  // do you stuff to reset your timer
}

因此,您现在应该将PageViewInheritedWidget一起包装起来,以使其尽可能高地包含在层次结构中(尽可能靠近主体)并为其提供处理方法

MyInheritedWidget(child: PageView(), handleOnTap: _handleUserInteraction)

最后,在您的onTap中调用InheritedWidget处理程序:

onTap: () {MyInheritedWidget.of(context).handleOnTap}