130 lines
4.5 KiB
Dart
130 lines
4.5 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:lamiter/Class/Question/question.dart';
|
|
import 'package:lamiter/Component/AppBar/title_app_bar.dart';
|
|
import 'package:lamiter/Component/Button/submit_button.dart';
|
|
import 'package:lamiter/Component/Diagnosis/diagnosis_unit_header.dart';
|
|
import 'package:lamiter/Component/loading.dart';
|
|
import 'package:lamiter/Extension/build_context.dart';
|
|
import 'package:lamiter/Extension/iterable.dart';
|
|
import 'package:lamiter/Provider/Form/form_provider.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
|
|
|
class DiagnosisFormPage<T extends FormProvider> extends StatefulWidget {
|
|
final String title;
|
|
final String infoText;
|
|
final dynamic prevForm;
|
|
|
|
const DiagnosisFormPage({
|
|
super.key,
|
|
required this.title,
|
|
required this.infoText,
|
|
required this.prevForm,
|
|
});
|
|
|
|
@override
|
|
State<DiagnosisFormPage<T>> createState() => _DiagnosisFormPageState<T>();
|
|
}
|
|
|
|
class _DiagnosisFormPageState<T extends FormProvider>
|
|
extends State<DiagnosisFormPage<T>> with AutomaticKeepAliveClientMixin {
|
|
final GlobalKey<SubmitButtonState> submitButtonKey =
|
|
GlobalKey<SubmitButtonState>();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
context.read<T>().start(widget.prevForm);
|
|
});
|
|
}
|
|
|
|
void success() {
|
|
Navigator.pop(context);
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
super.build(context);
|
|
final questions =
|
|
context.select<T, List<Question>>((provider) => provider.questions);
|
|
final enabled =
|
|
context.select<T, bool>((provider) => provider.isReadyToSubmit());
|
|
final submitting =
|
|
context.select<T, bool>((provider) => provider.submitting);
|
|
final loading = context.select<T, bool>((provider) => provider.loading);
|
|
|
|
return GestureDetector(
|
|
onTap: () => FocusManager.instance.primaryFocus?.unfocus(),
|
|
child: Stack(
|
|
alignment: Alignment.bottomCenter,
|
|
children: [
|
|
Scaffold(
|
|
appBar: TitleAppBar(title: widget.title),
|
|
body: SafeArea(
|
|
bottom: false,
|
|
child: Column(
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.only(top: 0.sp),
|
|
child: DiagnosisUnitHeader(text: widget.infoText),
|
|
),
|
|
Expanded(
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
children: questions
|
|
.padding(EdgeInsets.symmetric(horizontal: 32.sp))
|
|
.separator(SizedBox(height: 32.sp))
|
|
.firstPadding(EdgeInsets.only(top: 16.sp))
|
|
.lastPadding(
|
|
EdgeInsets.only(bottom: context.height(0.121)))
|
|
.toList(),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
widget.prevForm == null
|
|
? SubmitButton(
|
|
key: submitButtonKey,
|
|
text: AppLocalizations.of(context).submit,
|
|
enabled: enabled,
|
|
submitting: submitting,
|
|
onTap: () async {
|
|
if (!context.read<T>().isReadyToSubmit()) {
|
|
// submitButtonKey.currentState
|
|
// ?.showMessage(PopupMessageType.formIncompleteError);
|
|
return;
|
|
}
|
|
// bool isSuccess =
|
|
// await context.read<T>().submit(context, null);
|
|
|
|
Map<String, dynamic> response =
|
|
await context.read<T>().submit(context, null);
|
|
if (response.containsKey("success")) {
|
|
success();
|
|
return;
|
|
}
|
|
if (response.containsKey("errorMessage")) {
|
|
submitButtonKey.currentState?.showMessage(
|
|
response['errorMessage'],
|
|
context.error,
|
|
);
|
|
return;
|
|
}
|
|
},
|
|
)
|
|
: const SizedBox.shrink(),
|
|
loading ? const Loading() : const SizedBox.shrink(),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
@override
|
|
bool get wantKeepAlive => true;
|
|
}
|