使用Flutter - Dart模拟具有参数的路由

3
我有一个如下所示的小部件定义:
import ...;
...

class TechnicalError extends StatelessWidget {
    ...

    @override
    Widget build(BuildContext context) {
        TechnicalErrorPayload payload = ModalRoute.of(context).settings.arguments;

        return Scaffold(
            body: Column(...)
        );
    }
}

我还为该小部件定义了一个命名路由:

```我也为该widget定义了一个命名路由:```

import ...;
const String TECHNICAL_DIFFICULTIES = '/technical-difficulties';
class MyApp extends StatelessWidget {

    MyApp() {
        ...
    }

    @override
    Widget build(BuildContext context) {

        return MaterialApp(
            routes: <String, WidgetBuilder> {
            ...
            TECHNICAL_DIFFICULTIES: (BuildContext context) => TechnicalError()
        }

        ...
        );
    }
}

无论何时我想推送这个路由,我都会按照以下步骤进行:
var techErrPayload = TechnicalErrorPayload(...);
await Navigator.of(context).pushNamed(TECHNICAL_DIFFICULTIES, arguments: techErrPayload);

一切都按预期运行。问题出现在我想测试TechnicalError小部件时...如何将TechnicalErrorPayload传递给该小部件?它不是构造函数的一部分,而是由ModalRoute的属性获取。

这种方法行不通:

testWidgets('Me testing', (WidgetTester tester) async {
MaterialPageRoute test = MaterialPageRoute(
  builder: (BuildContext context) => TechnicalError(),

  settings: RouteSettings(
    name: 'Blah',
    arguments: TechnicalErrorPayload(friendlyErrorMessage: 'Hey Joe')
  )
);

//await tester.pumpWidget(WidgetWrapper.fromRouteWithNavigatorObservers(test, [navigatorobserverMock]));

await tester.pumpWidget(
  MaterialApp(
    navigatorObservers: [navigatorobserverMock],
    routes: {
      '/': (BuildContext context) => test.builder(context)
    },

  )
);
await tester.pumpAndSettle();
});

你解决了吗? - Anurag Bhandari
1个回答

3
为了测试使用路由参数的路由,我将我的屏幕小部件包装在MaterialPageRoute中。然后在路由设置中,我能够传递路由所需的任何参数。
await tester.pumpWidget(
  MaterialApp(
    onGenerateRoute: (settings) {
        return MaterialPageRoute(
          settings: RouteSettings(arguments: // Your Argument here),
          builder: (context) {
            return TheScreen();
          },
        );
      },
  )
);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接