// Copyright 2018 The Flutter team. 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/material.dart'; import 'package:flutter/widgets.dart'; import 'package:scoped_model/scoped_model.dart'; import 'package:veggieseasons/data/preferences.dart'; import 'package:veggieseasons/data/veggie.dart'; import 'package:veggieseasons/styles.dart'; import 'package:veggieseasons/widgets/settings_group.dart'; import 'package:veggieseasons/widgets/settings_item.dart'; class VeggieCategorySettingsScreen extends StatelessWidget { @override Widget build(BuildContext context) { final model = ScopedModel.of(context, rebuildOnChange: true); final currentPrefs = model.preferredCategories; return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( middle: Text('Preferred Categories'), previousPageTitle: 'Settings', ), backgroundColor: Styles.scaffoldBackground, child: FutureBuilder>( future: currentPrefs, builder: (context, snapshot) { final items = []; for (final category in VeggieCategory.values) { CupertinoSwitch toggle; // It's possible that category data hasn't loaded from shared prefs // yet, so display it if possible and fall back to disabled switches // otherwise. if (snapshot.hasData) { toggle = CupertinoSwitch( value: snapshot.data.contains(category), onChanged: (value) { if (value) { model.addPreferredCategory(category); } else { model.removePreferredCategory(category); } }, ); } else { toggle = CupertinoSwitch( value: false, onChanged: null, ); } items.add(SettingsItem( label: veggieCategoryNames[category], content: toggle, )); } return ListView( children: [ SettingsGroup( items: items, ), ], ); }, ), ); } } class CalorieSettingsScreen extends StatelessWidget { static const max = 1000; static const min = 2600; static const step = 200; @override Widget build(BuildContext context) { final model = ScopedModel.of(context, rebuildOnChange: true); return CupertinoPageScaffold( navigationBar: CupertinoNavigationBar( previousPageTitle: 'Settings', ), backgroundColor: Styles.scaffoldBackground, child: ListView( children: [ FutureBuilder( future: model.desiredCalories, builder: (context, snapshot) { final steps = []; for (int cals = max; cals < min; cals += step) { steps.add( SettingsItem( label: cals.toString(), icon: SettingsIcon( icon: Styles.checkIcon, foregroundColor: snapshot.hasData && snapshot.data == cals ? CupertinoColors.activeBlue : Styles.transparentColor, backgroundColor: Styles.transparentColor, ), onPress: snapshot.hasData ? () => model.setDesiredCalories(cals) : null, ), ); } return SettingsGroup( items: steps, header: SettingsGroupHeader('Available calorie levels'), footer: SettingsGroupFooter('These are used for serving ' 'calculations'), ); }, ), ], ), ); } } class SettingsScreen extends StatelessWidget { Widget _buildCaloriesItem(BuildContext context, Preferences prefs) { return SettingsItem( label: 'Calorie Target', icon: SettingsIcon( backgroundColor: Styles.iconBlue, icon: Styles.calorieIcon, ), content: FutureBuilder( future: prefs.desiredCalories, builder: (context, snapshot) { return Row( children: [ Text(snapshot.data?.toString() ?? ''), SizedBox(width: 8), SettingsNavigationIndicator(), ], ); }, ), onPress: () { Navigator.of(context).push( CupertinoPageRoute( builder: (context) => CalorieSettingsScreen(), title: 'Calorie Target', ), ); }, ); } Widget _buildCategoriesItem(BuildContext context, Preferences prefs) { return SettingsItem( label: 'Preferred Categories', subtitle: 'What types of veggies you prefer!', icon: SettingsIcon( backgroundColor: Styles.iconGold, icon: Styles.preferenceIcon, ), content: SettingsNavigationIndicator(), onPress: () { Navigator.of(context).push( CupertinoPageRoute( builder: (context) => VeggieCategorySettingsScreen(), title: 'Preferred Categories', ), ); }, ); } @override Widget build(BuildContext context) { final prefs = ScopedModel.of(context, rebuildOnChange: true); return CupertinoPageScaffold( child: Container( color: Styles.scaffoldBackground, child: CustomScrollView( slivers: [ CupertinoSliverNavigationBar( largeTitle: Text('Settings'), ), SliverSafeArea( top: false, sliver: SliverList( delegate: SliverChildListDelegate( [ SettingsGroup( items: [ _buildCaloriesItem(context, prefs), _buildCategoriesItem(context, prefs), ], ), ], ), ), ), ], ), ), ); } }