我正在try 使用一个自定义的Widget,它使用一个函数来执行Navit.pop().如果我在页面中使用GestureDetector,则从FirstPage到SecondPage的导航工作良好(已注释掉代码).但如果我使用一个单独的Widget(MyButton)以及一个应该触发Navigator.pop()的函数,那么Navigator.push()将不起作用.没有错误.感谢任何帮助.

import 'package:flutter/material.dart';

void main() => runApp(TestNavigation());

class TestNavigation extends StatelessWidget {
  const TestNavigation({super.key});
  @override Widget build(BuildContext context) {
    return const MaterialApp(home: FirstPage());
  }
}

class FirstPage extends StatefulWidget {
  const FirstPage({super.key});
  @override State<FirstPage> createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
            child: GestureDetector(
                onTap: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => SecondPage()));
                },
                child: const Text(
                  'Click to next Page',
                ))));
  }
}

class SecondPage extends StatelessWidget {
  @override Widget build(BuildContext context) {
    return Scaffold(
        // body: GestureDetector(
        //     onTap: () {
        //       Navigator.pop(context);
        //     },
        //     child: Container(
        //         child: Center(child: Text('Go back to first page')))));
        body: MyButton(
            onTap: () {
              Navigator.pop(context);
            },
            text: 'Go back to first page'));
  }
}

class MyButton extends StatelessWidget {
  final String text;
  final Function onTap;

  const MyButton({required this.text, required this.onTap});

  @override Widget build(BuildContext context) {
    return GestureDetector(
        onTap: onTap(), child: Center(child: Text(text)));
  }
}

没有进行导航.但如果我使用注释掉的代码,那么它就可以工作.

推荐答案

更改拨打onTap的方式 从onTap: onTap()onTap: () => onTap(),

这里是完整代码

import 'package:flutter/material.dart';

void main() => runApp(TestNavigation());

class TestNavigation extends StatelessWidget {
  const TestNavigation({super.key});
  @override Widget build(BuildContext context) {
    return const MaterialApp(home: FirstPage());
  }
}

class FirstPage extends StatefulWidget {
  const FirstPage({super.key});
  @override State<FirstPage> createState() => _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override Widget build(BuildContext context) {
    return Scaffold(
        body: Center(
            child: GestureDetector(
                onTap: () {
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => SecondPage()));
                },
                child: const Text(
                  'Click to next Page',
                ))));
  }
}

class SecondPage extends StatelessWidget {
  @override Widget build(BuildContext context) {
    return Scaffold(
        // body: GestureDetector(
        //     onTap: () {
        //       Navigator.pop(context);
        //     },
        //     child: Container(
        //         child: Center(child: Text('Go back to first page')))));
        body: MyButton(
            onTap: () {
              Navigator.pop(context);
            },
            text: 'Go back to first page'));
  }
}

class MyButton extends StatelessWidget {
  final String text;
  final Function onTap;

  const MyButton({required this.text, required this.onTap});

  @override Widget build(BuildContext context) {
    return GestureDetector(
        onTap:()=> onTap(), child: Center(child: Text(text)));
  }
}

Flutter相关问答推荐

来自另一个屏幕的数据

如何在Flutter的easy_translation包中链接嵌套的链接翻译?

我可以在iOS设备上使用Ffltter实现Google Pay按钮吗?

使用ThemeProvider不在亮模式和暗模式之间切换

如何在2024年使用Ffltter将用户数据保存在云FireStore中?

Flutter 翼future 建造者不断开火和重建.它在每次重建时都会生成一个新的随机数--我如何防止这种情况?

无法在我的Flutter 应用程序中使用GoRouter测试导航

有没有可能不在BlocBuilder中重新构建内容?

dart /长笛中的返回早期模式和拆分方法

输入处于活动状态时如何设置文本字段标签的样式?

Elevated 和 Outlined 按钮之间的动画

如何对齐卡片小部件中的图标按钮?

如何从 Flutter Slider Widget 中移除发光效果?

按下 Command+W 时关闭窗口

Flutter HLS .m3u8 视频无法实时播放

Flutter/Dart 返回_Future的实例而不是实际的字符串值

为什么 orientation == Orientation.portrait 总是正确的,尽管我的设备已经处于横向

CircleAvatar 在 ListTile 中领先

TextSpan 避免符号字符串组上的换行符

Flutter :RangeError(索引):无效值:不在包含范围内0..3:4使用IndexedListView.builder