代码之家  ›  专栏  ›  技术社区  ›  Jordan Davies

如何在小部件测试中查找屏幕外的ListView子项?

  •  0
  • Jordan Davies  · 技术社区  · 5 年前

    在列表视图中显示多个子项时,如果某个子项不在屏幕上,则小部件测试无法找到该子项。下面是一个完整的例子:

    主镖

    import 'package:flutter/material.dart';
    
    void main() => runApp(App());
    
    class App extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(home: Scaffold(body: Test()));
      }
    }
    
    class Test extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return ListView(
          children: <Widget>[
            Container(
              height: 600,
              color: Colors.red,
            ),
            Text("Find me!"),
          ],
        );
      }
    }
    

    主测试镖

    import 'package:flutter_app/main.dart';
    import 'package:flutter_test/flutter_test.dart';
    
    void main() {
      testWidgets("Find text", (WidgetTester tester) async {
        final testableWidget = App();
    
        await tester.pumpWidget(testableWidget);
    
        expect(find.text("Find me!"), findsOneWidget);
      });
    }
    

    但是,如果我更改 Container 在主镖到 599 它起作用了。

    有人知道为什么会这样吗?是虫子吗?有办法解决吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Rémi Rousselet    5 年前

    测试应该像你的应用程序那样工作,否则,你的测试将变得无用(因为你没有测试真正的行为)。 因此,这不是一个bug。

    您必须手动滚动 ListView 在您的测试中让它加载更多的小部件。

    这可以用 tester

    final gesture = await tester.startGesture(Offset.zero /* THe position of your listview */ );
    // Manual scroll
    await gesture.moveBy(const Offset(0, 100));
    
    await tester.pump(); // flush the widget tree 
    
    推荐文章