首页 > 解决方案 > 如何在 Flutter 集成测试中等待按钮启用

问题描述

在 Flutter 集成测试中,我想在按下按钮之前等待它启用。这可能吗?

标签: flutterflutter-test

解决方案


这个函数让你知道一个小部件是否被启用,然后你可以等待它改变状态:

Future<bool> isEnabled(FlutterDriver driver, SerializableFinder widgetFinder) async {
  Map widgetDiagnostics = await driver.getWidgetDiagnostics(widgetFinder);
  return widgetDiagnostics["properties"]
      .firstWhere((property) => property["name"] == 'enabled')["value"];
}

更新:这是那个等待的朋友

Future<void> waitForEnabled(
    FlutterDriver driver, SerializableFinder widgetFinder,
    {Duration timeout,
    Duration interval,
    bool value = true,
    String reason}) async {
  await driver.waitFor(widgetFinder, timeout: timeout);

  timeout ??= Duration(seconds: 5);
  interval ??= Duration(milliseconds: 250);
  var endTime = DateTime.now().add(timeout);

  while (true) {
    if (await isEnabled(driver, widgetFinder) == value) {
      return;
    } else if (DateTime.now().isAfter(endTime)) {
      throw TimeoutException(reason ??
          'widget did not become ${value ? 'enabled' : 'disabled'} within timeout');
    } else {
      await Future.delayed(interval);
      continue;
    }
  }
}

您可以通过value: false让它等待未启用


推荐阅读