0

我的问题是我有一个无状态小部件,它返回AppBar带有 onPressed 事件的 a。在我相应的 widgetTest 中,我点击组件并期望调用 onPressed 方法。然而,事实并非如此。

这是我的小部件:

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

class IconAppBar extends StatelessWidget with PreferredSizeWidget {
  final VoidCallback onPressed;

  IconAppBar({this.onPressed});

  @override
  Widget build(BuildContext context) {
    return AppBar(
      leading: IconButton(
        color: Colors.black,
        icon: SvgPicture.asset(
          "resources/images/icon.svg",
          width: 24,
          height: 24,
        ),
        onPressed: onPressed,
      ),
    );
  }

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

在测试中,如果组件被点击,我会通过一个简单的 onPressed 测试来创建小部件。

void main() {
    testWidgets("Should run onPressed when tapped",
        (WidgetTester tester) async {
      var counter = 0;
      void callback() {
        counter++;
      }

      await tester.pumpWidget(
        MediaQuery(
          data: MediaQueryData(),
          child: MaterialApp(
            localizationsDelegates: [
              GlobalMaterialLocalizations.delegate,
              GlobalWidgetsLocalizations.delegate,
              GlobalCupertinoLocalizations.delegate,
            ],
            home: IconAppBar(
              onPressed: callback,
            ),
          ),
        ),
      );

      await tester.pump(Duration(milliseconds: 300));
      await tester.tap(find.byType(IconAppBar));
      await tester.pump(Duration(milliseconds: 300));

      expect(counter, 1); // fails because actual counter is 0
    });
}

改变tester.pump()tester.pumpAndSettle()没有改变任何东西。该方法未被调用。

在实际设备或模拟器中运行它,onPressed 按预期工作。

还有一个烟雾测试find.byType(IconAppBar)确实找到了这个小部件。

我真的很感激任何帮助或想法。谢谢!

编辑:似乎这不适用于IconButton. 我只是将其更改为以FlatButtonSVG 作为其子级的,这很好。

4

1 回答 1

0

不知道这是否有帮助:

class IconAppBar extends StatelessWidget with PreferredSizeWidget {
  final VoidCallback onPressed;

  BackButtonAppBar({this.onPressed});

  void click() {
    print("Its Working!");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
      leading: IconButton(
        color: Colors.black,
        icon: SvgPicture.asset(
          "resources/images/icon.svg",
          width: 24,
          height: 24,
        ),
        onPressed: () {
          click();
        },
      ),
    );
  }
}
于 2020-09-25T19:55:26.920 回答