54 lines
1.4 KiB
Dart
54 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:pshared/provider/payment/amount.dart';
|
|
|
|
|
|
class PaymentCommentFieldController extends ChangeNotifier {
|
|
final TextEditingController textController;
|
|
|
|
PaymentAmountProvider? _provider;
|
|
bool _isSyncingText = false;
|
|
|
|
PaymentCommentFieldController({required String initialComment})
|
|
: textController = TextEditingController(text: initialComment);
|
|
|
|
void update(PaymentAmountProvider provider) {
|
|
if (identical(_provider, provider)) {
|
|
_syncTextWithComment(provider.comment);
|
|
return;
|
|
}
|
|
_provider?.removeListener(_handleProviderChanged);
|
|
_provider = provider;
|
|
_provider?.addListener(_handleProviderChanged);
|
|
_syncTextWithComment(provider.comment);
|
|
}
|
|
|
|
void handleChanged(String value) {
|
|
if (_isSyncingText) return;
|
|
_provider?.setComment(value);
|
|
}
|
|
|
|
void _handleProviderChanged() {
|
|
final provider = _provider;
|
|
if (provider == null) return;
|
|
_syncTextWithComment(provider.comment);
|
|
}
|
|
|
|
void _syncTextWithComment(String comment) {
|
|
if (textController.text == comment) return;
|
|
_isSyncingText = true;
|
|
textController.value = TextEditingValue(
|
|
text: comment,
|
|
selection: TextSelection.collapsed(offset: comment.length),
|
|
);
|
|
_isSyncingText = false;
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_provider?.removeListener(_handleProviderChanged);
|
|
textController.dispose();
|
|
super.dispose();
|
|
}
|
|
}
|