Рефакторинг frontend/pweb/lib/pages/payment_methods/page.dart #169
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
1) Убрать провайдеры из
buildЧто сделать: вынести
MultiProviderизPaymentPage.buildв отдельный виджет-обёрткуPaymentPageScope(или поднять выше по дереву, где роут создаётся).Зачем: сейчас при каждом rebuild страницы пересоздаётся конфигурация провайдеров → нестабильный lifecycle, лишние перезапуски логики.
Критерий:
PaymentPageстановится “тонким” UI, а провайдеры создаются один раз на вход в страницу.2) Никаких side effects в
ProxyProvider.updateЧто сделать: убрать
flow.sync(...)изChangeNotifierProxyProvider2.update.Варианты без Riverpod/BLoC:
didChangeDependencies()или в отдельный метод, вызываемый из listener’а наRecipientsProvider/PaymentMethodsProvider;PaymentFlowProviderтак, чтобы он принимал входы через сеттеры, аsyncвызывался явным образом (не в update).Зачем:
updateдолжен только прокидывать зависимости, иначе легко получить циклыnotifyListeners()→ rebuild → update → sync → notify…Критерий: в
ProxyProvider.updateнет вызовов, которые меняют состояние других провайдеров (кроме “set dependencies”).3) Вычислять
availableTypesодин раз и без дублированияЧто сделать:
_availablePaymentTypesв отдельную чистую функцию/extension;availableTypesодин раз черезcontext.select/Selector(получатель + готовность методов + список методов/фильтрованный список).Зачем: сейчас маппинг считается несколько раз (и в build, и внутри update), плюс лишние перестроения.
Критерий: один источник правды для
availableTypes, нет повторных вызовов в рамках одного билда.4) Починить автоселект метода по кошельку (по событию “данные готовы”)
Что сделать:
_handleWalletAutoSelectionне вызывать “после кадра” вслепую.Сделать listener, который срабатывает один раз при переходе
methodsProvider.isReady == trueи только если естьselectedWallet.Минимальный вариант:
bool _walletApplied = false;в
didChangeDependencies()или черезaddListenerнаPaymentMethodsProvider:!_walletApplied && wallet != null && methodsProvider.isReady→ применить и поставить_walletApplied=true.Зачем: сейчас можно попасть в состояние “кошелёк есть, методы ещё не подгрузились” → автоселект не случится.
Критерий: автоселект срабатывает гарантированно и ровно один раз.
5) Убрать хрупкий матч по
description.contains(wallet.walletUserID)Что сделать: заменить поиск метода для кошелька на структурированное поле.
Варианты:
walletUserId/walletRefвPaymentMethod.data(лучше);metadataвPaymentMethod, где будет ключwalletUserId.Зачем:
containsпо строке — источник тихих багов.Критерий:
_getPaymentMethodForWalletне парситdescription.6) Разделить UI и управляющую логику внутри страницы
Что сделать: вынести обработчики в маленький класс
PaymentPageActions(без смены архитектуры), который принимает нужные провайдеры и делает:selectRecipient,clearRecipient,onSearchChanged,send.Зачем: сейчас
Stateперегружен и смешивает все обязанности.Критерий:
Stateхранит только контроллеры/фокус и делегирует действия.7) Снизить количество
watchи перестроенийЧто сделать: заменить
context.watchнаcontext.selectтам, где нужны конкретные поля:recipientProvider.currentObjectmethodsProvider.isReadymethodsProvider.methods(или уже отфильтрованный список)quotationProvider.isReadyflowProvider.selectedTypeЗачем: меньше лишних rebuild.
Критерий: изменение не относящихся данных не перерисовывает всю страницу.
Минимальный результат
ProxyProvider.updateне мутирует чужое состояние.availableTypesне пересчитывается по кругу.