Unverified Commit 59c9d4e8 authored by Hans Muller's avatar Hans Muller Committed by GitHub

Added ExpansionTileController (#123298)

Added ExpansionTileController
parent f7fb14ec
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flutter code sample for [ExpansionTile] and [ExpansionTileController]
import 'package:flutter/material.dart';
void main() {
runApp(const ExpansionTileControllerApp());
}
class ExpansionTileControllerApp extends StatefulWidget {
const ExpansionTileControllerApp({ super.key });
@override
State<ExpansionTileControllerApp> createState() => _ExpansionTileControllerAppState();
}
class _ExpansionTileControllerAppState extends State<ExpansionTileControllerApp> {
final ExpansionTileController controller = ExpansionTileController();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Code Sample for ExpansionTileController.',
theme: ThemeData(useMaterial3: true),
home: Scaffold(
appBar: AppBar(title: const Text('ExpansionTileController Example')),
body: Column(
children: <Widget>[
// A controller has been provided to the ExpansionTile because it's
// going to be accessed from a component that is not within the
// tile's BuildContext.
ExpansionTile(
controller: controller,
title: const Text('ExpansionTile with explicit controller.'),
children: <Widget>[
Container(
alignment: Alignment.center,
padding: const EdgeInsets.all(24),
child: const Text('ExpansionTile Contents'),
),
],
),
const SizedBox(height: 8),
ElevatedButton(
child: const Text('Expand/Collapse the Tile Above'),
onPressed: () {
if (controller.isExpanded) {
controller.collapse();
} else {
controller.expand();
}
},
),
const SizedBox(height: 48),
// A controller has not been provided to the ExpansionTile because
// the automatically created one can be retrieved via the tile's BuildContext.
ExpansionTile(
title: const Text('ExpansionTile with implicit controller.'),
children: <Widget>[
Builder(
builder: (BuildContext context) {
return Container(
padding: const EdgeInsets.all(24),
alignment: Alignment.center,
child: ElevatedButton(
child: const Text('Collapse This Tile'),
onPressed: () {
return ExpansionTileController.of(context).collapse();
},
),
);
},
),
],
),
],
),
),
);
}
}
// Copyright 2014 The Flutter 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_api_samples/material/expansion_tile/expansion_tile.1.dart' as example;
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Test the basics of ExpansionTileControllerApp', (WidgetTester tester) async {
await tester.pumpWidget(
const example.ExpansionTileControllerApp(),
);
expect(find.text('ExpansionTile Contents'), findsNothing);
expect(find.text('Collapse This Tile'), findsNothing);
await tester.tap(find.text('Expand/Collapse the Tile Above'));
await tester.pumpAndSettle();
expect(find.text('ExpansionTile Contents'), findsOneWidget);
await tester.tap(find.text('Expand/Collapse the Tile Above'));
await tester.pumpAndSettle();
expect(find.text('ExpansionTile Contents'), findsNothing);
await tester.tap(find.text('ExpansionTile with implicit controller.'));
await tester.pumpAndSettle();
expect(find.text('Collapse This Tile'), findsOneWidget);
await tester.tap(find.text('Collapse This Tile'));
await tester.pumpAndSettle();
expect(find.text('Collapse This Tile'), findsNothing);
});
}
......@@ -729,4 +729,119 @@ void main() {
expect(getTextColor(), theme.colorScheme.primary);
});
});
testWidgets('ExpansionTileController isExpanded, expand() and collapse()', (WidgetTester tester) async {
final ExpansionTileController controller = ExpansionTileController();
await tester.pumpWidget(MaterialApp(
home: Material(
child: ExpansionTile(
controller: controller,
title: const Text('Title'),
children: const <Widget>[
Text('Child 0'),
],
),
),
));
expect(find.text('Child 0'), findsNothing);
expect(controller.isExpanded, isFalse);
controller.expand();
expect(controller.isExpanded, isTrue);
await tester.pumpAndSettle();
expect(find.text('Child 0'), findsOneWidget);
expect(controller.isExpanded, isTrue);
controller.collapse();
expect(controller.isExpanded, isFalse);
await tester.pumpAndSettle();
expect(find.text('Child 0'), findsNothing);
});
testWidgets('Calling ExpansionTileController.expand/collapsed has no effect if it is already expanded/collapsed', (WidgetTester tester) async {
final ExpansionTileController controller = ExpansionTileController();
await tester.pumpWidget(MaterialApp(
home: Material(
child: ExpansionTile(
controller: controller,
title: const Text('Title'),
initiallyExpanded: true,
children: const <Widget>[
Text('Child 0'),
],
),
),
));
expect(find.text('Child 0'), findsOneWidget);
expect(controller.isExpanded, isTrue);
controller.expand();
expect(controller.isExpanded, isTrue);
await tester.pump();
expect(tester.hasRunningAnimations, isFalse);
expect(find.text('Child 0'), findsOneWidget);
controller.collapse();
expect(controller.isExpanded, isFalse);
await tester.pump();
expect(tester.hasRunningAnimations, isTrue);
await tester.pumpAndSettle();
expect(controller.isExpanded, isFalse);
expect(find.text('Child 0'), findsNothing);
controller.collapse();
expect(controller.isExpanded, isFalse);
await tester.pump();
expect(tester.hasRunningAnimations, isFalse);
});
testWidgets('Call to ExpansionTileController.of()', (WidgetTester tester) async {
final GlobalKey titleKey = GlobalKey();
final GlobalKey childKey = GlobalKey();
await tester.pumpWidget(MaterialApp(
home: Material(
child: ExpansionTile(
initiallyExpanded: true,
title: Text('Title', key: titleKey),
children: <Widget>[
Text('Child 0', key: childKey),
],
),
),
));
final ExpansionTileController controller1 = ExpansionTileController.of(childKey.currentContext!);
expect(controller1.isExpanded, isTrue);
final ExpansionTileController controller2 = ExpansionTileController.of(titleKey.currentContext!);
expect(controller2.isExpanded, isTrue);
expect(controller1, controller2);
});
testWidgets('Call to ExpansionTile.maybeOf()', (WidgetTester tester) async {
final GlobalKey titleKey = GlobalKey();
final GlobalKey nonDescendantKey = GlobalKey();
await tester.pumpWidget(MaterialApp(
home: Material(
child: Column(
children: <Widget>[
ExpansionTile(
title: Text('Title', key: titleKey),
children: const <Widget>[
Text('Child 0'),
],
),
Text('Non descendant', key: nonDescendantKey),
],
),
),
));
final ExpansionTileController? controller1 = ExpansionTileController.maybeOf(titleKey.currentContext!);
expect(controller1, isNotNull);
expect(controller1?.isExpanded, isFalse);
final ExpansionTileController? controller2 = ExpansionTileController.maybeOf(nonDescendantKey.currentContext!);
expect(controller2, isNull);
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment