APP_NEW/lib/Page/Diagnosis/diagnosis_form_page.dart
2025-03-11 21:17:14 +08:00

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;
}