Started Porting Progress Creation Screen

Signed-off-by: Andreas Fahrecker <AndreasFahrecker@gmail.com>
This commit is contained in:
Andreas Fahrecker 2021-03-16 16:33:46 +01:00
parent 45d4f7ba3a
commit aabeef6384
6 changed files with 212 additions and 24 deletions

View File

@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux/redux.dart';
import 'package:time_progress_tracker/models/app_settings.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart';
import 'package:time_progress_tracker/redux/app_state.dart';
import 'package:time_progress_tracker/redux/redux_selectors.dart';
import '../../utils/helper_functions.dart';
class CreateTimeProgressStoreConnector extends StatelessWidget {
final Widget Function(BuildContext, CreateTimeProgressViewModel)
loadedBuilder;
CreateTimeProgressStoreConnector({
@required this.loadedBuilder,
});
@override
Widget build(BuildContext context) {
return StoreConnector<AppState, CreateTimeProgressViewModel>(
onInit: loadTimeProgressListIfUnloaded,
converter: (store) => CreateTimeProgressViewModel._create(store),
builder: (context, CreateTimeProgressViewModel vm) {
return loadedBuilder(context, vm);
},
);
}
}
class CreateTimeProgressViewModel {
final TimeProgress defaultProgress;
final void Function(TimeProgress) addTimeProgress;
CreateTimeProgressViewModel(
this.defaultProgress,
this.addTimeProgress,
);
factory CreateTimeProgressViewModel._create(Store<AppState> store) {
AppSettings settings = appSettingsSelector(store.state);
void _addTimeProgress(TimeProgress tp) {
if (TimeProgress.isValid(tp)) store.dispatch(AddTimeProgressAction(tp));
}
return CreateTimeProgressViewModel(
TimeProgress.defaultFromDuration(settings.duration),
_addTimeProgress,
);
}
}

View File

@ -1,36 +1,36 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/ui/screens/progress_creation_screen.dart'; import 'package:time_progress_tracker/ui/screens/progress_creation_screen.dart';
import 'package:time_progress_tracker/utils/helper_functions.dart'; import 'package:time_progress_tracker/utils/helper_functions.dart';
class CreateProgressButton extends StatelessWidget { class CreateProgressButton extends StatelessWidget {
final String _heroTag = "createProgressBTN"; final String _heroTag = "createTimeProgressBTN";
final void Function() createProgress;
const CreateProgressButton({Key key, @required this.createProgress})
: super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
void _onButtonPressed() => Navigator.push(
context,
platformPageRoute(
context: context,
builder: (context) => ProgressCreationScreen(),
));
Widget _renderCupertino() { Widget _renderCupertino() {
return PlatformButton( return PlatformButton(
padding: EdgeInsets.all(4), padding: EdgeInsets.all(4),
child: Icon( child: Icon(
Icons.add, Icons.save,
color: Colors.white, color: Colors.white,
), ),
onPressed: _onButtonPressed, onPressed: () => createProgress(),
); );
} }
Widget _renderMaterial() { Widget _renderMaterial() {
return FloatingActionButton( return FloatingActionButton(
heroTag: _heroTag, heroTag: _heroTag,
child: Icon(Icons.add), child: Icon(Icons.save),
onPressed: _onButtonPressed, onPressed: () => createProgress(),
); );
} }

View File

@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:time_progress_tracker/ui/screens/progress_creation_screen.dart';
import 'package:time_progress_tracker/utils/helper_functions.dart';
class GoToCreateProgressButton extends StatelessWidget {
final String _heroTag = "createProgressBTN";
@override
Widget build(BuildContext context) {
void _onButtonPressed() => Navigator.push(
context,
platformPageRoute(
context: context,
builder: (context) => ProgressCreationScreen(),
));
Widget _renderCupertino() {
return PlatformButton(
padding: EdgeInsets.all(4),
child: Icon(
Icons.add,
color: Colors.white,
),
onPressed: _onButtonPressed,
);
}
Widget _renderMaterial() {
return FloatingActionButton(
heroTag: _heroTag,
child: Icon(Icons.add),
onPressed: _onButtonPressed,
);
}
return useCupertino() ? _renderCupertino() : _renderMaterial();
}
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:time_progress_tracker/models/time_progress.dart'; import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/ui/buttons/date_picker_btn.dart'; import 'package:time_progress_tracker/ui/buttons/date_picker_btn.dart';
@ -64,8 +65,10 @@ class _ProgressEditorWidgetState extends State<ProgressEditorWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> columnChildren = [ List<Widget> columnChildren = [
Expanded( Expanded(
child: TextField( child: Center(
child: PlatformTextField(
controller: _nameTextController, controller: _nameTextController,
material: (context, platform) => MaterialTextFieldData(
decoration: InputDecoration( decoration: InputDecoration(
border: OutlineInputBorder(), border: OutlineInputBorder(),
labelText: "Progress Name", labelText: "Progress Name",
@ -74,6 +77,15 @@ class _ProgressEditorWidgetState extends State<ProgressEditorWidget> {
: "The Name need to have at least 3 and at max 20 symbols.", : "The Name need to have at least 3 and at max 20 symbols.",
), ),
), ),
cupertino: (context, platform) => CupertinoTextFieldData(
placeholder: "Progress Name",
decoration: BoxDecoration(
border: Border.all(width: 2, color: Colors.grey),
borderRadius: BorderRadius.circular(32),
)
),
),
),
), ),
Expanded( Expanded(
child: Row( child: Row(

View File

@ -1,7 +1,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart'; import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:time_progress_tracker/ui/buttons/create_progress_button.dart'; import 'package:time_progress_tracker/ui/buttons/go_to_create_progress_button.dart';
import 'package:time_progress_tracker/ui/screens/active_time_progresses_screen.dart'; import 'package:time_progress_tracker/ui/screens/active_time_progresses_screen.dart';
import 'package:time_progress_tracker/ui/screens/inactive_time_progresses_screen.dart'; import 'package:time_progress_tracker/ui/screens/inactive_time_progresses_screen.dart';
import 'package:time_progress_tracker/ui/screens/settings_screen.dart'; import 'package:time_progress_tracker/ui/screens/settings_screen.dart';
@ -42,7 +42,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
} }
Widget _renderCreateProgressBtn() => Widget _renderCreateProgressBtn() =>
_tabSelectedIndex == 2 ? null : CreateProgressButton(); _tabSelectedIndex == 2 ? null : GoToCreateProgressButton();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {

View File

@ -1,14 +1,18 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:redux/redux.dart'; import 'package:redux/redux.dart';
import 'package:time_progress_tracker/models/app_settings.dart'; import 'package:time_progress_tracker/models/app_settings.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart'; import 'package:time_progress_tracker/redux/actions/time_progress_actions.dart';
import 'package:time_progress_tracker/redux/app_state.dart'; import 'package:time_progress_tracker/redux/app_state.dart';
import 'package:time_progress_tracker/models/time_progress.dart';
import 'package:time_progress_tracker/redux/redux_selectors.dart'; import 'package:time_progress_tracker/redux/redux_selectors.dart';
import 'package:time_progress_tracker/utils/helper_functions.dart'; import 'package:time_progress_tracker/redux/store_connectors/create_time_progress_store_connector.dart';
import 'package:time_progress_tracker/ui/buttons/create_progress_button.dart';
import 'package:time_progress_tracker/ui/progress/progress_editor_widget.dart'; import 'package:time_progress_tracker/ui/progress/progress_editor_widget.dart';
import 'package:time_progress_tracker/utils/color_utils.dart';
import 'package:time_progress_tracker/utils/helper_functions.dart';
class ProgressCreationScreen extends StatefulWidget { class ProgressCreationScreen extends StatefulWidget {
static const routeName = "/create-progress"; static const routeName = "/create-progress";
@ -41,6 +45,86 @@ class _ProgressCreationScreenState extends State<ProgressCreationScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
void _onCreateTimeProgress(CreateTimeProgressViewModel vm) {
if (!_isProgressValid) return null;
vm.addTimeProgress(timeProgressToCreate);
Navigator.pop(context);
}
initTimeProgress(TimeProgress.defaultFromDuration(
StoreProvider.of<AppState>(context).state.appSettings.duration));
return PlatformScaffold(
appBar: PlatformAppBar(
title: Text(
ProgressCreationScreen.title,
style: toolbarTextStyle,
),
cupertino: (_, __) => CupertinoNavigationBarData(
transitionBetweenRoutes: false,
trailing: CreateTimeProgressStoreConnector(
loadedBuilder: (context, CreateTimeProgressViewModel vm) =>
CreateProgressButton(
createProgress: () => _onCreateTimeProgress(vm),
),
),
),
),
material: (_, __) => MaterialScaffoldData(
floatingActionButton: Row(
children: [
Expanded(
child: CreateTimeProgressStoreConnector(
loadedBuilder: (context, CreateTimeProgressViewModel vm) =>
CreateProgressButton(
createProgress: () => _onCreateTimeProgress(vm),
),
),
)
],
),
),
body: ProgressEditorWidget(
timeProgress: timeProgressToCreate,
onTimeProgressChanged: onTimeProgressChanged,
),
);
return CreateTimeProgressStoreConnector(
loadedBuilder: (context, CreateTimeProgressViewModel vm) {
initTimeProgress(vm.defaultProgress);
return PlatformScaffold(
appBar: PlatformAppBar(
title: Text(
ProgressCreationScreen.title,
style: toolbarTextStyle,
),
cupertino: (_, __) => CupertinoNavigationBarData(
transitionBetweenRoutes: false,
trailing: CreateProgressButton(
createProgress: () => _onCreateTimeProgress(vm),
),
),
),
material: (_, __) => MaterialScaffoldData(
floatingActionButton: Row(
children: [
Expanded(
child: CreateProgressButton(
createProgress: () => _onCreateTimeProgress(vm),
),
)
],
),
),
body: ProgressEditorWidget(
timeProgress: timeProgressToCreate,
onTimeProgressChanged: onTimeProgressChanged,
),
);
},
);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(ProgressCreationScreen.title), title: Text(ProgressCreationScreen.title),