From 83f37246d521f46118089e4f4bb901b3b9728e3f Mon Sep 17 00:00:00 2001 From: Dragos Tiselice Date: Tue, 19 Jul 2016 13:22:24 -0700 Subject: [PATCH] Added backgroundImage to CircleAvatar. In order to have an efficient way to display clipped avatars, backgroundImage was added inside of the container's BoxDecoration. Fixes #4964. This commit also fixes #4567 where the radius property actually sets the diamater. --- .../lib/src/material/circle_avatar.dart | 15 ++++++++--- .../test/material/circle_avatar_test.dart | 26 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 packages/flutter/test/material/circle_avatar_test.dart diff --git a/packages/flutter/lib/src/material/circle_avatar.dart b/packages/flutter/lib/src/material/circle_avatar.dart index 5f8ad882af..c5913ee4a0 100644 --- a/packages/flutter/lib/src/material/circle_avatar.dart +++ b/packages/flutter/lib/src/material/circle_avatar.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'constants.dart'; @@ -24,7 +25,8 @@ class CircleAvatar extends StatelessWidget { Key key, this.child, this.backgroundColor, - this.radius: 40.0 + this.backgroundImage, + this.radius: 20.0 }) : super(key: key); /// The widget below this widget in the tree. @@ -34,6 +36,10 @@ class CircleAvatar extends StatelessWidget { /// color will cause the avatar to animate to the new color. final Color backgroundColor; + /// The background image of the circle. Changing the background + /// image will cause the avatar to animate to the new image. + final ImageProvider backgroundImage; + /// The size of the avatar. Changing the radius will cause the /// avatar to animate to the new size. final double radius; @@ -44,11 +50,14 @@ class CircleAvatar extends StatelessWidget { final Color color = backgroundColor ?? theme.primaryColor; return new AnimatedContainer( - width: radius, - height: radius, + width: radius * 2.0, + height: radius * 2.0, duration: kThemeChangeDuration, decoration: new BoxDecoration( backgroundColor: color, + backgroundImage: backgroundImage != null ? new BackgroundImage( + image: backgroundImage + ) : null, shape: BoxShape.circle ), child: new Center( diff --git a/packages/flutter/test/material/circle_avatar_test.dart b/packages/flutter/test/material/circle_avatar_test.dart new file mode 100644 index 0000000000..0a6786cb9a --- /dev/null +++ b/packages/flutter/test/material/circle_avatar_test.dart @@ -0,0 +1,26 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + testWidgets('CircleAvatar test', (WidgetTester tester) async { + await tester.pumpWidget( + new Center( + child: new CircleAvatar( + backgroundColor: Colors.blue[400], + radius: 50.0, + child: new Text('Z') + ) + ) + ); + + RenderBox box = tester.renderObject(find.byType(CircleAvatar)); + expect(box.size.width, equals(100.0)); + expect(box.size.height, equals(100.0)); + + expect(find.text('Z'), findsOneWidget); + }); +}