【问题标题】:Flutter custom appbar back function is not being triggered未触发 Flutter 自定义应用栏后退功能
【发布时间】:2023-02-07 01:14:53
【问题描述】:

我有一个自定义的 AppBar,它有一个应该处理屏幕的 OnBackPressed 的功能,但不幸的是没有被触发并且不知道为什么。

基本上我希望在按下后退按钮时离开当前屏幕。

@override
Widget build(BuildContext context) {
    return Scaffold(
      appBar: ComponentAppBar(
        showGoBackButton: true,
        onGoBackPressed: () => Get.back(),
      ),
      body: Container(),
    );
}

自定义应用栏文件:

import 'package:flutter/material.dart';

class ComponentAppBar extends StatefulWidget implements PreferredSizeWidget {
  final bool showGoBackButton;
  final Function onGoBackPressed;

  const ComponentAppBar({
    Key? key,
    required this.showGoBackButton,
    required this.onGoBackPressed,
  }) : super(key: key);

  @override
  _ComponentAppBarState createState() => _ComponentAppBarState();

  @override
  Size get preferredSize => const Size.fromHeight(kToolbarHeight);
}

class _ComponentAppBarState extends State<ComponentAppBar> {

  @override
  Widget build(BuildContext context) {
    return AppBar(
      title: Row(
        mainAxisAlignment: MainAxisAlignment.start,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          //           
        ],
      ),
      leading: widget.showGoBackButton
          ? IconButton(
              onPressed: () => widget.onGoBackPressed,
              icon: const Icon(
                Icons.arrow_back,
                color: Colors.black,
              ),
            )
          : Container(),
      automaticallyImplyLeading: false,
      leadingWidth: !widget.showGoBackButton ? 0 : 30,
    );
  }
}

非常简单,但是,当按下后退按钮时没有任何反应。

我调试了什么:

  • 使用Navigator.pop()代替Get.back()——同样的问题
  • 添加输出onGoBackPressed: () =&gt; { print('testing') } - 无输出
  • onPressed: () =&gt; widget.onGoBackPressed更改为onPressed: () =&gt; Get.back(),有效
  • onPressed: () =&gt; widget.onGoBackPressed更改为onPressed: () =&gt; { print('test directly in class') },有效

还有,在使用F5调试工具的时候,显示是这样的,很奇怪:

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    这都是关于回调的。 您收到一个回调作为参数 (onGoBackPressed),您需要执行它才能使其正常工作。有两种方法可以做到这一点:

    onPressed: widget.onGoBackPressed, //This should work since you're assigning directly onGoBackPressed as the callback to be executed by onPressed
    
    onPressed: ()=>widget.onGoBackPressed.call(), //This should work since you're calling onGoBackPressed callback. In other words, you're executing it. Before, you were just referencing it, without actually executing
    

    提示:我建议您在键入参数时避免动态。因此,我建议您具体输入 onGoBackPressed 回调将返回的内容。这边走:

      final void Function() onGoBackPressed;
    

    哪个是一样的

      final VoidCallback onGoBackPressed;
    

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多