gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 07:13:06 31 4
gpt4 key购买 nike

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

  • ma​​in.dart
  • PageView(带 bottomNavigationBar)(home.dart)(带计时器)
    • 第 1 页
      • 第 1 页摘要(使用 ListView)(page_1.dart)
      • ListTile 1 onTab
        • ListView A (a.dart)
          • FormA (form_a.dart)
      • 在选项卡上列出磁贴 2
      • 在选项卡上列出磁贴 3
    • 第 2 页
    • 第 3 页

如何将 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;
}

该小部件对于在层次结构中检索子小部件与其父小部件之一之间的公共(public)数据很有用。

在您的主文件中,创建您的处理程序以匹配 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}

关于timer - 如何将 onTab 信号从嵌套的有状态小部件发送到 main.dart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53427476/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com