如何将 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.
- main.dart
- PageView(带bottomNavigationBar)(home.dart)(带定时器)
- 第1页
- 第 1 页摘要(使用 ListView)(page_1.dart)
- Tab 上的 ListTile 1
- 列表视图 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;
}
该小部件对于在层次结构中检索子小部件与其父小部件之一之间的公共数据很有用。
在您的主文件中,创建您的处理程序以匹配 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}
在我的 main.dart 中,我有一个计时器和 GestureDetector。 GestureDetector onTap 等处理与 _handleUserInteraction() 的用户交互。 每次用户点击应用程序时都会重置计时器。我的问题是我需要将 onTab(或类似)信号从 form_a.dart 发送到 home.dart.
- main.dart
- PageView(带bottomNavigationBar)(home.dart)(带定时器)
- 第1页
- 第 1 页摘要(使用 ListView)(page_1.dart)
- Tab 上的 ListTile 1
- 列表视图 A (a.dart)
- FormA (form_a.dart)
- 列表视图 A (a.dart)
- 在选项卡上列出磁贴 2
- 在选项卡上列出磁贴 3
- 第 2 页
- 第 3 页
- 第1页
如何将 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}