| // 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. |
| |
| // Template: dev/snippets/config/templates/stateless_widget_scaffold_center.tmpl |
| // |
| // Comment lines marked with "▼▼▼" and "▲▲▲" are used for authoring |
| // of samples, and may be ignored if you are just exploring the sample. |
| |
| // Flutter code sample for OrderedTraversalPolicy |
| // |
| //*************************************************************************** |
| //* ▼▼▼▼▼▼▼▼ description ▼▼▼▼▼▼▼▼ (do not modify or remove section marker) |
| |
| // This sample shows how to assign a traversal order to a widget. In the |
| // example, the focus order goes from bottom right (the "One" button) to top |
| // left (the "Six" button). |
| |
| //* ▲▲▲▲▲▲▲▲ description ▲▲▲▲▲▲▲▲ (do not modify or remove section marker) |
| //*************************************************************************** |
| |
| import 'package:flutter/material.dart'; |
| |
| void main() => runApp(const MyApp()); |
| |
| /// This is the main application widget. |
| class MyApp extends StatelessWidget { |
| const MyApp({Key? key}) : super(key: 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 Center( |
| child: MyStatelessWidget(), |
| ), |
| ), |
| ); |
| } |
| } |
| |
| //***************************************************************************** |
| //* ▼▼▼▼▼▼▼▼ code-preamble ▼▼▼▼▼▼▼▼ (do not modify or remove section marker) |
| |
| class DemoButton extends StatelessWidget { |
| const DemoButton({ |
| Key? key, |
| required this.name, |
| this.autofocus = false, |
| required this.order, |
| }) : super(key: key); |
| |
| final String name; |
| final bool autofocus; |
| final double order; |
| |
| void _handleOnPressed() { |
| print('Button $name pressed.'); |
| debugDumpFocusTree(); |
| } |
| |
| @override |
| Widget build(BuildContext context) { |
| return FocusTraversalOrder( |
| order: NumericFocusOrder(order), |
| child: TextButton( |
| autofocus: autofocus, |
| onPressed: () => _handleOnPressed(), |
| child: Text(name), |
| ), |
| ); |
| } |
| } |
| |
| //* ▲▲▲▲▲▲▲▲ code-preamble ▲▲▲▲▲▲▲▲ (do not modify or remove section marker) |
| //***************************************************************************** |
| |
| /// This is the stateless widget that the main application instantiates. |
| class MyStatelessWidget extends StatelessWidget { |
| const MyStatelessWidget({Key? key}) : super(key: key); |
| |
| @override |
| //******************************************************************** |
| //* ▼▼▼▼▼▼▼▼ code ▼▼▼▼▼▼▼▼ (do not modify or remove section marker) |
| |
| Widget build(BuildContext context) { |
| return FocusTraversalGroup( |
| policy: OrderedTraversalPolicy(), |
| child: Column( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: <Widget>[ |
| Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: const <Widget>[ |
| DemoButton(name: 'Six', order: 6), |
| ], |
| ), |
| Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: const <Widget>[ |
| DemoButton(name: 'Five', order: 5), |
| DemoButton(name: 'Four', order: 4), |
| ], |
| ), |
| Row( |
| mainAxisAlignment: MainAxisAlignment.center, |
| children: const <Widget>[ |
| DemoButton(name: 'Three', order: 3), |
| DemoButton(name: 'Two', order: 2), |
| DemoButton(name: 'One', order: 1, autofocus: true), |
| ], |
| ), |
| ], |
| ), |
| ); |
| } |
| |
| //* ▲▲▲▲▲▲▲▲ code ▲▲▲▲▲▲▲▲ (do not modify or remove section marker) |
| //******************************************************************** |
| |
| } |