【问题标题】:flutter dependOnInheritedWidgetOfExactType fails in test颤振dependOnInheritedWidgetOfExactType在测试中失败
【发布时间】:2020-07-20 18:40:05
【问题描述】:

应用程序在flutter run 下正常运行

使用flutter drive --target=test_driver/main.dart,对dependOnInheritedWidgetOfExactType 的调用返回null

一些相关代码:

class TimerServiceProvider extends InheritedWidget {
  const TimerServiceProvider({Key key, this.service, Widget child})
      : super(key: key, child: child);
  final TimerService service;
  @override
  bool updateShouldNotify(TimerServiceProvider old) => service != old.service;
}

在 MyApp 中,小部件树以 TimerServiceProvider 开头

final timerService = TimerService();

  @override
  Widget build(BuildContext context) {
    return TimerServiceProvider(
        // provide timer service to all widgets of your app
        service: timerService,
...

在其中一个页面上

timerService = TimerService.of(context);

在函数TimerService.of 中,dependOnInheritedWidgetOfExactType 返回null。这在正常的应用程序执行期间工作正常,如果从 flutter driver 运行则返回 null。

static TimerService of(BuildContext context) {
    var provider =
        context.dependOnInheritedWidgetOfExactType<TimerServiceProvider>();
    return provider.service;
  }

颤抖的医生

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.1)
[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.47.2)
[✓] Connected device (1 available)

• No issues found!

【问题讨论】:

  • 这段代码没问题。您的问题可能出在其他地方,例如将TimerServiceProvider 放在Home 中,但尝试以不同的路径访问它
  • TimerServiceProvider 位于小部件树的顶部。在主(主页)页面之后,使用 Navigator.push 访问所有其他页面
  • 我会考虑打印你的小部件树和你的上下文,看看你的 TimerServiceProvider 是否是上下文的祖先。很可能是错误。
  • 我试图理解为什么这会在普通的flutter run 中起作用,但在flutter driver 中不起作用。
  • 您的小部件树可能具有不同的结构。

标签: flutter flutter-test


【解决方案1】:

Phil,尝试为您的服务设置类型。

TimerService timerService = TimerService(); //HERE

  @override
  Widget build(BuildContext context) {
    return TimerServiceProvider(
        // provide timer service to all widgets of your app
        service: timerService,

我的测试遇到了类似的错误,我的 InheritedWidget 具有通用类型。我的应用按预期运行,但测试与您的在同一点失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2021-06-06
    • 2018-08-09
    相关资源
    最近更新 更多