109 lines
3.3 KiB
Dart
109 lines
3.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:nearby_service_example_full/domain/app_service.dart';
|
|
import 'package:nearby_service_example_full/domain/app_state.dart';
|
|
import 'package:provider/provider.dart';
|
|
|
|
import 'builder/app_step_view_builder.dart';
|
|
import 'components/info_panel.dart';
|
|
|
|
const kPinkColor = Color(0xFFC80099);
|
|
const kBlueColor = Color(0xFF0043D5);
|
|
const kWhiteColor = Color(0xFFFFFFFF);
|
|
const kGreyColor = Color(0xFF607D8B);
|
|
const kGreenColor = Color(0xFF07B988);
|
|
|
|
class App extends StatefulWidget {
|
|
const App({super.key, required this.service});
|
|
|
|
final AppService service;
|
|
|
|
@override
|
|
State<App> createState() => _AppState();
|
|
}
|
|
|
|
class _AppState extends State<App> {
|
|
final scaffoldKey = GlobalKey<ScaffoldState>();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ChangeNotifierProvider.value(
|
|
value: widget.service,
|
|
child: MaterialApp(
|
|
theme: ThemeData(
|
|
colorScheme: ColorScheme.fromSeed(seedColor: kBlueColor),
|
|
),
|
|
home: Scaffold(
|
|
key: scaffoldKey,
|
|
appBar: AppBar(
|
|
title: const Text('Nearby service example app'),
|
|
actions: [
|
|
Builder(builder: (context) {
|
|
return IconButton(
|
|
onPressed: () => InfoPanel.show(context),
|
|
icon: const Icon(Icons.info_outline),
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
body: _AppBody(scaffoldKey),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _AppBody extends StatelessWidget {
|
|
const _AppBody(this.scaffoldKey);
|
|
|
|
final GlobalKey<ScaffoldState> scaffoldKey;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Selector<AppService, AppState>(
|
|
selector: (context, service) => service.state,
|
|
builder: (context, state, _) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.stretch,
|
|
children: [
|
|
const Padding(
|
|
padding: EdgeInsets.fromLTRB(16, 12, 16, 10),
|
|
child: InfoPanel(),
|
|
),
|
|
Flexible(
|
|
child: MediaQuery.removePadding(
|
|
context: context,
|
|
removeLeft: true,
|
|
child: Stepper(
|
|
controlsBuilder: (context, _) => const SizedBox.shrink(),
|
|
currentStep: state.step,
|
|
steps: [
|
|
...AppState.steps.map(
|
|
(e) {
|
|
final builder = AppStepViewBuilder(state: e);
|
|
final isActive = e == state;
|
|
return Step(
|
|
isActive: isActive,
|
|
title: builder.buildTitle(),
|
|
subtitle: builder.buildSubtitle(),
|
|
content: builder.buildContent(
|
|
scaffoldKey: scaffoldKey,
|
|
),
|
|
state: isActive
|
|
? StepState.indexed
|
|
: e.step < state.step
|
|
? StepState.complete
|
|
: StepState.disabled,
|
|
);
|
|
},
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
}
|