| // 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 IndexedStack. |
| |
| import 'package:flutter/material.dart'; |
| |
| void main() => runApp(const MyApp()); |
| |
| class MyApp extends StatelessWidget { |
| const MyApp({super.key}); |
| |
| static const String _title = 'Flutter Code Sample'; |
| |
| @override |
| Widget build(BuildContext context) { |
| return MaterialApp( |
| title: _title, |
| home: Scaffold( |
| appBar: AppBar(title: const Text(_title)), |
| body: const MyStatefulWidget(), |
| ), |
| ); |
| } |
| } |
| |
| class MyStatefulWidget extends StatefulWidget { |
| const MyStatefulWidget({super.key}); |
| |
| @override |
| State<MyStatefulWidget> createState() => _MyStatefulWidgetState(); |
| } |
| |
| class _MyStatefulWidgetState extends State<MyStatefulWidget> { |
| List<String> names = <String>['Dash', 'John', 'Mary']; |
| int index = 0; |
| final TextEditingController fieldText = TextEditingController(); |
| |
| @override |
| Widget build(BuildContext context) { |
| return Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| SizedBox( |
| width: 300, |
| child: TextField( |
| decoration: const InputDecoration( |
| border: OutlineInputBorder(), |
| hintText: 'Enter the name for a person to track', |
| ), |
| onSubmitted: (String value) { |
| setState(() { |
| names.add(value); |
| }); |
| fieldText.clear(); |
| }, |
| controller: fieldText, |
| ), |
| ), |
| const SizedBox(height: 50), |
| Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| GestureDetector( |
| onTap: () { |
| setState(() { |
| if (index == 0) { |
| index = names.length - 1; |
| } else { |
| index -= 1; |
| } |
| }); |
| }, |
| child: const Icon(key: Key('gesture1'), Icons.chevron_left), |
| ), |
| Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| IndexedStack( |
| index: index, |
| children: <Widget>[ |
| for (String name in names) PersonTracker(name: name) |
| ], |
| ) |
| ], |
| ), |
| GestureDetector( |
| onTap: () { |
| setState(() { |
| if (index == names.length - 1) { |
| index = 0; |
| } else { |
| index += 1; |
| } |
| }); |
| }, |
| child: const Icon(key: Key('gesture2'), Icons.chevron_right), |
| ), |
| ], |
| ) |
| ], |
| ); |
| } |
| } |
| |
| class PersonTracker extends StatefulWidget { |
| const PersonTracker({super.key, required this.name}); |
| final String name; |
| @override |
| State<PersonTracker> createState() => _PersonTrackerState(); |
| } |
| |
| class _PersonTrackerState extends State<PersonTracker> { |
| int counter = 0; |
| @override |
| Widget build(BuildContext context) { |
| return Container( |
| key: Key(widget.name), |
| decoration: BoxDecoration( |
| color: const Color.fromARGB(255, 239, 248, 255), |
| border: Border.all(color: const Color.fromARGB(255, 54, 60, 244)), |
| borderRadius: const BorderRadius.all(Radius.circular(10)), |
| ), |
| padding: const EdgeInsets.all(16.0), |
| child: Column( |
| children: <Widget>[ |
| Text('Name: ${widget.name}'), |
| Text('Score: $counter'), |
| TextButton.icon( |
| key: Key('increment${widget.name}'), |
| icon: const Icon(Icons.add), |
| onPressed: () { |
| setState(() { |
| counter += 1; |
| }); |
| }, |
| label: const Text('Increment'), |
| ) |
| ], |
| ), |
| ); |
| } |
| } |