跳至主要内容

带颜色优化容器

摘要

#

框架中添加了一个新的 ColoredBox widget,并且 Container widget 进行了优化,如果用户指定了 color 而不是 decoration,则会使用它。

上下文

#

通常情况下,Container widget 的使用方式如下所示

dart
return Container(color: Colors.red);

以前,这段代码生成的 widget 层次结构使用 BoxDecoration 来实际绘制背景颜色。BoxDecoration widget 涵盖了除了绘制背景颜色之外的许多其他情况,并且效率不如新的 ColoredBox widget,后者只绘制背景颜色。

以前,想要根据 widget 树中容器的颜色进行断言的 widget 测试需要找到 BoxDecoration 来实际获取容器的颜色。现在,除非显式地将 BoxDecoration 作为 decoration 属性提供,否则它们可以直接检查 Container 本身的 color 属性。同时,向 Container 提供 colordecoration 仍然是一个错误。

迁移指南

#

需要修改断言 Container 颜色或期望它创建 BoxDecoration 的测试。

迁移前的代码

dart
testWidgets('Container color', (WidgetTester tester) async {
  await tester.pumpWidget(Container(color: Colors.red));

  final Container container = tester.widgetList<Container>().first;
  expect(container.decoration.color, Colors.red);
  // Or, a test may have specifically looked for the BoxDecoration, e.g.:
  expect(find.byType(BoxDecoration), findsOneWidget);
});

迁移后的代码

dart
testWidgets('Container color', (WidgetTester tester) async {
  await tester.pumpWidget(Container(color: Colors.red));

  final Container container = tester.widgetList<Container>().first;
  expect(container.color, Colors.red);
  // If your test needed to work directly with the BoxDecoration, it should
  // instead look for the ColoredBox, e.g.:
  expect(find.byType(BoxDecoration), findsNothing);
  expect(find.byType(ColoredBox), findsOneWidget);
});

时间线

#

包含在版本中:1.15.4
稳定版本:1.17

参考文献

#

API 文档

相关问题

相关 PR