One UI in flutter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
3.7 KiB

2 years ago
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:onemd/widget/provider/selectedDoctorProvider.dart';
import '../model/ac_doctor_model.dart';
import '../provider/dio_provider.dart';
import '../repository/mitra_repository.dart';
import 'fx_data_mitra.dart';
import 'fx_text_field.dart';
import 'provider/doctor_address_lookup_provider.dart';
// ignore: must_be_immutable
class FxAcDoctor extends HookConsumerWidget {
final String? errorValidation;
FxAcDoctor({Key? key, this.errorValidation}) : super(key: key);
2 years ago
CancelToken? cancelToken;
@override
Widget build(BuildContext context, WidgetRef ref) {
final errorMessage = useState("");
final ctrl = useTextEditingController(text: "");
cancelToken = CancelToken();
final fc = FocusNode();
final selectedDoctor = ref.read(selectedAcDoctorProvider);
if (selectedDoctor != null) {
ctrl.text = selectedDoctor.fullName;
}
ref.listen<AcDoctorResponseModel?>(selectedAcDoctorProvider, ((prev, next) {
if (next != null) {
ref
.read(doctorAddressLookupProvider.notifier)
.lookup(doctorID: next.mDoctorID);
}
}));
return RawAutocomplete<AcDoctorResponseModel>(
textEditingController: ctrl,
displayStringForOption: (model) => model.fullName,
focusNode: fc,
fieldViewBuilder: (context, ctrl, fc, onChange) {
return FxTextField(
label: "Doctor",
hint: "Doctor",
fc: fc,
ctrl: ctrl,
errorMessage: errorValidation,
2 years ago
);
},
optionsBuilder: (tv) async {
try {
final dio = ref.read(dioProvider);
await Future.delayed(const Duration(milliseconds: 300));
final resp = await MitraRepository(dio: dio)
.lookupDoctor(query: ctrl.text, cancelToken: cancelToken);
return resp;
} catch (e) {
errorMessage.value = "lookupDoctor Error";
}
return [];
},
optionsViewBuilder: (context, onSelect, listModel) {
return Align(
alignment: Alignment.topLeft,
child: SizedBox(
width: 400,
child: Material(
child: ListView.builder(
itemCount: listModel.length,
itemBuilder: (context, idx) {
final model = listModel.elementAt(idx);
return InkWell(
onTap: () {
ref.read(selectedAcDoctorProvider.notifier).state =
model;
onSelect(model);
},
child: Container(
color: (idx % 2 == 1)
? Colors.blue.shade100.withOpacity(0.2)
: null,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
FxNormalBlueText(
title: model.fullName,
isBold: true,
),
],
),
),
));
}),
),
),
);
});
}
}