// Copyright 2015 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:padder/padding.dart'; import 'comunes_flutter.dart'; class AppIntroItem { final IconData icon; final String title; final String subTitle; AppIntroItem({required this.icon, required this.title, this.subTitle = ''}); // 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec vitae eros. Nunc sit amet neque. Ut id dui. Integer viverra feugiat sem. Morbi aliquam turpis rhoncus sapien volutpat condimentum.'}); } typedef void OnIntroFinish(BuildContext context); typedef List ListItems(BuildContext context); abstract class AppIntroPage extends StatelessWidget { static const String routeName = '/appintro'; final ListItems items; final OnIntroFinish onIntroFinish; const AppIntroPage( {Key? key, required this.items, required this.onIntroFinish}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( // appBar: AppBar(), body: DefaultTabController( length: items(context).length, child: _AppIntroPageSelector(items: items, onFinish: onIntroFinish), ), ); } } class _AppIntroPageSelector extends StatelessWidget { const _AppIntroPageSelector({required this.items, required this.onFinish}); final ListItems items; final OnIntroFinish onFinish; void _handleArrowButtonPress(BuildContext context, int delta) { final TabController controller = DefaultTabController.of(context)!; if (!controller.indexIsChanging) controller.animateTo( (controller.index + delta).clamp(0, items(context).length - 1)); } @override Widget build(BuildContext context) { final TabController controller = DefaultTabController.of(context)!; final ThemeData theme = Theme.of(context); final Color color = theme.colorScheme.secondary; final TextStyle titleStyle = (theme.textTheme.headlineSmall ?? const TextStyle()) .copyWith(color: color); final TextStyle subTitleStyle = theme.textTheme.titleMedium ?? const TextStyle(); // final TextStyle descriptionStyle = theme.textTheme.subhead; return SafeArea( top: true, bottom: false, child: Column( children: [ Row(mainAxisAlignment: MainAxisAlignment.end, children: [ IconButton( onPressed: () { onFinish(context); }, icon: const Icon(Icons.close, size: 30.0, color: Colors.black38)), ]), Expanded(child: OrientationBuilder(builder: (context, orientation) { return IconTheme( data: IconThemeData( size: orientation == Orientation.portrait ? 200.0 : 100.0, color: color, ), child: TabBarView( children: items(context).map((AppIntroItem item) { return Container( padding: const EdgeInsets.all(12.0), child: Center( child: CenteredSpaceEvenlyColumn(children: [ Icon( item.icon, semanticLabel: item.title, ), Padding( padding: const EdgeInsets.only(left: 16.0, right: 16.0), child: CenteredColumn(children: [ Text( item.title, style: titleStyle, textAlign: TextAlign.center, ), const SizedBox(height: 20.0), Text( item.subTitle, style: subTitleStyle, textAlign: TextAlign.center, ) ])), ]), ), ); }).toList()), ); })), Container( margin: const EdgeInsets.only(top: 16.0), child: Row( children: listWithoutNulls([ IconButton( icon: const Icon(Icons.chevron_left), color: color, onPressed: () { _handleArrowButtonPress(context, -1); }, tooltip: 'Page back'), TabPageSelector(controller: controller), IconButton( icon: const Icon(Icons.chevron_right), color: color, onPressed: () { _handleArrowButtonPress(context, 1); if (!controller.indexIsChanging && controller.index == items(context).length - 1) { onFinish(context); } }, tooltip: 'Page forward'), ]), mainAxisAlignment: MainAxisAlignment.spaceBetween)), ], ), ); } }