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

How can I send onTab signal from nested stateful widget to main.dart

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

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

我需要从 home.dart

下的任何小部件(尽可能深入)访问 _timer abd void _handleUserInteraction() 函数
import 'package:flutter/material.dart';
import 'dart:async';
import 'main.dart';
import 'details.dart';


class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {

  Timer _timer;

  // TODO: 3 - INITIALIZE TIMER
  void _initializeTimer() {
    _timer = Timer.periodic(const Duration(minutes: 5), (__) {
      _logOutUser();
    });
  }

  // TODO: 4 - LOG OUT USER
  void _logOutUser() {
    _timer.cancel();

    Navigator.push(context,
        new MaterialPageRoute(builder: (context) => new MyApp()));

  }

  // TODO: 5 - HANDLE USER INTERACTION
  void _handleUserInteraction([_]) {
    if (!_timer.isActive) {
      return;
    }
    _timer.cancel();
    _initializeTimer();
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: _handleUserInteraction,
        onDoubleTap: _handleUserInteraction,
        onLongPress: _handleUserInteraction,
        onScaleEnd: _handleUserInteraction,
        onScaleStart: _handleUserInteraction,
        onScaleUpdate: _handleUserInteraction,
        onTapCancel: _handleUserInteraction,
        onTapDown: _handleUserInteraction,
        onTapUp: _handleUserInteraction,
        child: new Scaffold(
          appBar: AppBar(
            title: Text("HOME PAGE"),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'GOTO DETAILS PAGE',
                ),
                new RaisedButton(
                    child: new Text("Details"),
                    onPressed: (){
                      Navigator.push(context,
                          new MaterialPageRoute(builder: (context) => new Details()));
                    }
                )
              ],
            ),
          ),
        ));
  }
}


class LoginState extends InheritedWidget{

  LoginState({Key key, Widget child});

  @override
  bool updateShouldNotify(InheritedWidget oldWidget) => true;
}   

一种方法是使用 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
}

所以你现在应该用你的 InheritedWidget 包装你的 PageView 以将它包含在尽可能高的层次结构中(尽可能接近你的 main )并给它你的处理方法

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

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

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