Skip to content

Commit c84a934

Browse files
committed
[#19] Create the UI for Survey
1 parent 0069a84 commit c84a934

File tree

5 files changed

+137
-8
lines changed

5 files changed

+137
-8
lines changed

lib/l10n/app_en.arb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@
1010
"genericError": "Something went wrong.\nPlease try again!",
1111
"loginFailAlertTitle": "Unable to log in",
1212
"today": "Today",
13-
"errorText": "Error"
13+
"errorText": "Error",
14+
"startSurveyButton": "Start Survey"
1415
}

lib/main.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import 'package:flutter_config/flutter_config.dart';
33
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
44
import 'package:flutter_riverpod/flutter_riverpod.dart';
55
import 'package:go_router/go_router.dart';
6+
import 'package:survey_flutter/model/survey_model.dart';
67
import 'package:survey_flutter/screens/home/home_screen.dart';
78
import 'package:survey_flutter/screens/login/login_screen.dart';
89
import 'package:survey_flutter/screens/splash/splash_screen.dart';
10+
import 'package:survey_flutter/screens/survey/survey_screen.dart';
911
import 'package:survey_flutter/storage/survey_storage.dart';
1012
import 'package:survey_flutter/theme/app_theme.dart';
1113

@@ -41,6 +43,12 @@ class App extends StatelessWidget {
4143
path: routePathHomeScreen,
4244
builder: (_, __) => const HomeScreen(),
4345
),
46+
GoRoute(
47+
path: routePathSurveyScreen,
48+
builder: (_, state) => SurveyScreen(
49+
survey: state.extra as SurveyModel,
50+
),
51+
),
4452
],
4553
);
4654

lib/screens/home/home_pages_widget.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ class HomePagesWidget extends StatelessWidget {
1111
final List<SurveyModel> surveys;
1212
final ValueNotifier<int> currentPage;
1313
final PageController _pageController = PageController();
14+
final VoidCallback onNextButtonPressed;
1415

1516
HomePagesWidget({
1617
Key? key,
1718
required this.surveys,
1819
required this.currentPage,
20+
required this.onNextButtonPressed,
1921
}) : super(key: key);
2022

2123
@override
@@ -50,12 +52,7 @@ class HomePagesWidget extends StatelessWidget {
5052
),
5153
child: HomeFooterWidget(
5254
survey: surveys[index],
53-
onNextButtonPressed: () {
54-
if (currentPage.value < surveys.length - 1) {
55-
currentPage.value = index + 1;
56-
_pageController.jumpToPage(currentPage.value);
57-
}
58-
},
55+
onNextButtonPressed: onNextButtonPressed,
5956
),
6057
),
6158
),

lib/screens/home/home_screen.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import 'package:flutter/material.dart';
22
import 'package:flutter_riverpod/flutter_riverpod.dart';
3+
import 'package:go_router/go_router.dart';
34
import 'package:survey_flutter/model/survey_model.dart';
45
import 'package:survey_flutter/screens/home/home_header_widget.dart';
5-
import 'package:survey_flutter/screens/home/home_pages_widget.dart';
66
import 'package:survey_flutter/screens/home/home_page_indicator_widget.dart';
7+
import 'package:survey_flutter/screens/home/home_pages_widget.dart';
78
import 'package:survey_flutter/screens/home/home_shimmer_loading.dart';
89
import 'package:survey_flutter/screens/home/home_view_model.dart';
10+
import 'package:survey_flutter/screens/survey/survey_screen.dart';
911
import 'package:survey_flutter/utils/build_context_ext.dart';
1012
import 'package:survey_flutter/widgets/alert_dialog.dart';
1113

@@ -85,6 +87,13 @@ class _HomeScreenState extends ConsumerState<HomeScreen> {
8587
HomePagesWidget(
8688
surveys: surveys,
8789
currentPage: _currentPage,
90+
onNextButtonPressed: () {
91+
final survey = surveys[_currentPage.value];
92+
context.push(
93+
routePathSurveyScreen,
94+
extra: survey,
95+
);
96+
},
8897
),
8998
const HomeHeaderWidget(),
9099
Align(
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:survey_flutter/gen/assets.gen.dart';
3+
import 'package:survey_flutter/model/survey_model.dart';
4+
import 'package:survey_flutter/theme/app_constants.dart';
5+
import 'package:survey_flutter/theme/primary_button_style.dart';
6+
import 'package:survey_flutter/utils/build_context_ext.dart';
7+
8+
const routePathSurveyScreen = '/survey';
9+
const _buttonHeight = 56.0;
10+
11+
class SurveyScreen extends StatelessWidget {
12+
final SurveyModel survey;
13+
SurveyScreen({required this.survey, super.key});
14+
15+
late final _backgroundImage = FadeInImage.assetNetwork(
16+
placeholder: Assets.images.placeholder.path,
17+
image: survey.coverImageUrl,
18+
fit: BoxFit.cover,
19+
width: double.infinity,
20+
height: double.infinity,
21+
);
22+
23+
late final _gradientOverlay = Container(
24+
decoration: BoxDecoration(
25+
gradient: LinearGradient(
26+
begin: Alignment.topCenter,
27+
end: Alignment.bottomCenter,
28+
colors: [
29+
Colors.black.withOpacity(0.8),
30+
Colors.black.withOpacity(0.2),
31+
Colors.black.withOpacity(0.8),
32+
],
33+
),
34+
),
35+
);
36+
37+
Widget _buildTitle(BuildContext context) {
38+
return Text(
39+
survey.title,
40+
style: context.textTheme.titleMedium,
41+
maxLines: 2,
42+
);
43+
}
44+
45+
Widget _buildDescription(BuildContext context) {
46+
return Text(
47+
survey.description,
48+
style: context.textTheme.bodyMedium,
49+
maxLines: 2,
50+
);
51+
}
52+
53+
Widget _buildButton(BuildContext context) {
54+
return SizedBox(
55+
height: _buttonHeight,
56+
child: ElevatedButton(
57+
style: PrimaryButtonStyle(
58+
hintTextStyle: context.textTheme.labelMedium,
59+
),
60+
child: Text(
61+
context.localizations.startSurveyButton,
62+
),
63+
onPressed: () {
64+
// TODO: Start survey
65+
},
66+
),
67+
);
68+
}
69+
70+
@override
71+
Widget build(BuildContext context) {
72+
return Scaffold(
73+
appBar: AppBar(
74+
backgroundColor: Colors.transparent,
75+
elevation: 0,
76+
),
77+
extendBodyBehindAppBar: true,
78+
body: LayoutBuilder(
79+
builder: (_, __) {
80+
return Stack(
81+
children: [
82+
_backgroundImage,
83+
_gradientOverlay,
84+
Container(
85+
padding: const EdgeInsets.only(
86+
bottom: Metrics.spacing20,
87+
left: Metrics.spacing20,
88+
right: Metrics.spacing20,
89+
),
90+
child: SafeArea(
91+
child: Column(
92+
crossAxisAlignment: CrossAxisAlignment.start,
93+
children: [
94+
_buildTitle(context),
95+
const SizedBox(height: Metrics.spacing16),
96+
_buildDescription(context),
97+
const Spacer(),
98+
Row(
99+
children: [
100+
const Spacer(),
101+
_buildButton(context),
102+
],
103+
),
104+
],
105+
),
106+
),
107+
),
108+
],
109+
);
110+
},
111+
),
112+
);
113+
}
114+
}

0 commit comments

Comments
 (0)