【问题标题】:Finding a widget inside of a CustomScrollView in Flutter test在 Flutter 测试中查找 CustomScrollView 内的小部件
【发布时间】:2021-07-08 11:23:39
【问题描述】:


我在尝试测试我的 Flutter 应用程序时遇到了错误。我有一个自定义小部件,它位于CustomScrollView 小部件的底部(在第一个视口之外)。在我的测试中,我想验证它确实存在。
我已经尝试过使用WidgetTester.scrollUntilVisibleWidgetTester.drag(就像在颤振框架的测试中所做的那样)。此外,我尝试使用 FlutterDriver 重构我的测试,这完全搞砸了其他一切。
如何滚动到测试中 CustomScrollView 的底部?
这个最小的复制显示了包含 CustomScrollView 的应用程序,它有一个高度为一个屏幕的 Container 小部件(因此我要查找的小部件不在初始视图中)

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          body: CustomScrollView(
        slivers: [
          SliverToBoxAdapter(
            child: Container(
              height: MediaQuery.of(context).size.height,
            ),
          ),
          MyWidget(),
        ],
      )),
    );
  }
}

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return SliverToBoxAdapter(
      child: Container(
        height: 100,
        width: 100,
      ),
    );
  }
}

这是我最初为查找小部件而编写的测试,当然失败了。

void main() {
  testWidgets('main contains mywidget', (WidgetTester tester) async {
    // arange
    await tester.pumpWidget(MyApp());
    // act
    final myWidget = find.byType(MyWidget);
    // assert
    expect(myWidget, findsOneWidget);
  });
}

在本次迭代中,我使用了WidgetTester.scrollUntilVisible 函数,但出现以下错误。

void main() {
  testWidgets('main contains mywidget', (WidgetTester tester) async {
    // arange
    await tester.pumpWidget(MyApp());
    // act
    final myWidget = find.byType(MyWidget);
    final customScrollView = find.byType(CustomScrollView);
    await tester.scrollUntilVisible(myWidget, 100,
        scrollable: customScrollView);
    await tester.pump();
    // assert
    expect(myWidget, findsOneWidget);
  });
}
══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following _CastError was thrown running a test:
type 'CustomScrollView' is not a subtype of type 'Scrollable' in type cast

When the exception was thrown, this was the stack:
#0      WidgetController.widget (package:flutter_test/src/controller.dart:66:44)
#1      WidgetController.scrollUntilVisible.<anonymous closure> (package:flutter_test/src/controller.dart:995:15)
#2      WidgetController.scrollUntilVisible.<anonymous closure> (package:flutter_test/src/controller.dart:993:39)
#5      TestAsyncUtils.guard (package:flutter_test/src/test_async_utils.dart:72:41)
#6      WidgetController.scrollUntilVisible (package:flutter_test/src/controller.dart:993:27)
#7      main.<anonymous closure> (file:///C:/Users/X/test_example/test/main_test.dart:12:18)
<asynchronous suspension>
<asynchronous suspension>
(elided 3 frames from dart:async and package:stack_trace)

感谢任何有关如何解决此问题并成功测试我的 CustomScrollView 的帮助或建议

【问题讨论】:

    标签: flutter flutter-test customscrollview widget-test-flutter flutter-integration-test


    【解决方案1】:

    我遇到了同样的问题,最终我使用了 dragUntilVisible() 方法而不是 scrollUntilVisible()。

    向下滚动直到小部件可见的示例:

    await tester.dragUntilVisible(myWidget, customScrollView, Offset(0, -500));
    

    【讨论】:

      猜你喜欢
      • 2022-12-12
      • 1970-01-01
      • 2021-02-04
      • 2019-02-25
      • 2022-08-03
      • 2019-06-13
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多