Skip to content

Commit

Permalink
Create CupertinoRadio Widget (#123296)
Browse files Browse the repository at this point in the history
Create CupertinoRadio Widget
  • Loading branch information
MitchellGoodwin authored Mar 30, 2023
1 parent 8afd600 commit 84078c8
Show file tree
Hide file tree
Showing 7 changed files with 872 additions and 0 deletions.
75 changes: 75 additions & 0 deletions examples/api/lib/cupertino/radio/cupertino_radio.0.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
// 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/cupertino.dart';

/// Flutter code sample for [CupertinoRadio].
void main() => runApp(const CupertinoRadioApp());

class CupertinoRadioApp extends StatelessWidget {
const CupertinoRadioApp({super.key});

static const String _title = 'CuptertinoRadio Example';

@override
Widget build(BuildContext context) {
return const CupertinoApp(
theme: CupertinoThemeData(brightness: Brightness.light),
home: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text(_title),
),
child: SafeArea(
child: CupertinoRadioExample(),
),
),
);
}
}

enum SingingCharacter { lafayette, jefferson }

class CupertinoRadioExample extends StatefulWidget {
const CupertinoRadioExample({super.key});

@override
State<CupertinoRadioExample> createState() => _CupertinoRadioExampleState();
}

class _CupertinoRadioExampleState extends State<CupertinoRadioExample> {
SingingCharacter? _character = SingingCharacter.lafayette;

@override
Widget build(BuildContext context) {
return CupertinoListSection(
children: <Widget>[
CupertinoListTile(
title: const Text('Lafayette'),
leading: CupertinoRadio<SingingCharacter>(
value: SingingCharacter.lafayette,
groupValue: _character,
onChanged: (SingingCharacter? value) {
setState(() {
_character = value;
});
},
),
),
CupertinoListTile(
title: const Text('Thomas Jefferson'),
leading: CupertinoRadio<SingingCharacter>(
value: SingingCharacter.jefferson,
groupValue: _character,
onChanged: (SingingCharacter? value) {
setState(() {
_character = value;
});
},
),
),
],
);
}
}
78 changes: 78 additions & 0 deletions examples/api/lib/cupertino/radio/cupertino_radio.toggleable.0.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// 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/cupertino.dart';

/// Flutter code sample for [CupertinoRadio.toggleable].
void main() => runApp(const CupertinoRadioApp());

class CupertinoRadioApp extends StatelessWidget {
const CupertinoRadioApp({super.key});

static const String _title = 'CuptertinoRadio Toggleable Example';

@override
Widget build(BuildContext context) {
return const CupertinoApp(
home: CupertinoPageScaffold(
navigationBar: CupertinoNavigationBar(
middle: Text(_title),
),
child: SafeArea(
child: CupertinoRadioExample(),
),
),
);
}
}

enum SingingCharacter { mulligan, hamilton }

class CupertinoRadioExample extends StatefulWidget {
const CupertinoRadioExample({super.key});

@override
State<CupertinoRadioExample> createState() => _CupertinoRadioExampleState();
}

class _CupertinoRadioExampleState extends State<CupertinoRadioExample> {
SingingCharacter? _character = SingingCharacter.mulligan;

@override
Widget build(BuildContext context) {
return CupertinoListSection(
children: <Widget>[
CupertinoListTile(
title: const Text('Hercules Mulligan'),
leading: CupertinoRadio<SingingCharacter>(
value: SingingCharacter.mulligan,
groupValue: _character,
// TRY THIS: Try setting the toggleable value to false and
// see how that changes the behavior of the widget.
toggleable: true,
onChanged: (SingingCharacter? value) {
setState(() {
_character = value;
});
},
),
),
CupertinoListTile(
title: const Text('Eliza Hamilton'),
leading: CupertinoRadio<SingingCharacter>(
value: SingingCharacter.hamilton,
groupValue: _character,
toggleable: true,
onChanged: (SingingCharacter? value) {
setState(() {
_character = value;
});
},
),
),
],
);
}
}
32 changes: 32 additions & 0 deletions examples/api/test/cupertino/radio/cupertino_radio.0_test.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// 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/cupertino.dart';
import 'package:flutter_api_samples/cupertino/radio/cupertino_radio.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
testWidgets('Has 2 CupertinoRadio widgets', (WidgetTester tester) async {
await tester.pumpWidget(
const example.CupertinoRadioApp(),
);

expect(find.byType(CupertinoRadio<example.SingingCharacter>), findsNWidgets(2));

CupertinoRadio<example.SingingCharacter> radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).first);
expect(radio.groupValue, example.SingingCharacter.lafayette);

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).last);
expect(radio.groupValue, example.SingingCharacter.lafayette);

await tester.tap(find.byType(CupertinoRadio<example.SingingCharacter>).last);
await tester.pumpAndSettle();

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).last);
expect(radio.groupValue, example.SingingCharacter.jefferson);

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).first);
expect(radio.groupValue, example.SingingCharacter.jefferson);
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// 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/cupertino.dart';
import 'package:flutter_api_samples/cupertino/radio/cupertino_radio.toggleable.0.dart' as example;
import 'package:flutter_test/flutter_test.dart';

void main() {
testWidgets('Has 2 CupertinoRadio widgets that can be toggled off', (WidgetTester tester) async {
await tester.pumpWidget(
const example.CupertinoRadioApp(),
);

expect(find.byType(CupertinoRadio<example.SingingCharacter>), findsNWidgets(2));

CupertinoRadio<example.SingingCharacter> radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).first);
expect(radio.groupValue, example.SingingCharacter.mulligan);

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).last);
expect(radio.groupValue, example.SingingCharacter.mulligan);

await tester.tap(find.byType(CupertinoRadio<example.SingingCharacter>).last);
await tester.pumpAndSettle();

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).last);
expect(radio.groupValue, example.SingingCharacter.hamilton);

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).first);
expect(radio.groupValue, example.SingingCharacter.hamilton);

await tester.tap(find.byType(CupertinoRadio<example.SingingCharacter>).last);
await tester.pumpAndSettle();

radio = tester.widget(find.byType(CupertinoRadio<example.SingingCharacter>).last);
expect(radio.groupValue, null);
});
}
1 change: 1 addition & 0 deletions packages/flutter/lib/cupertino.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export 'src/cupertino/magnifier.dart';
export 'src/cupertino/nav_bar.dart';
export 'src/cupertino/page_scaffold.dart';
export 'src/cupertino/picker.dart';
export 'src/cupertino/radio.dart';
export 'src/cupertino/refresh.dart';
export 'src/cupertino/route.dart';
export 'src/cupertino/scrollbar.dart';
Expand Down
Loading

0 comments on commit 84078c8

Please sign in to comment.