Flutter вызывает функцию Riverpod без использования context.read()
По умолчанию после определения
Riverpod
провайдеры, мы можем щелкнуть любой виджет, чтобы вызвать какой-либо метод, например, получение данных из веб-сервиса или что-то еще.
Например:
context.read(washingServiceProvider.notifier).getService;
теперь моя проблема в том, как я могу назвать это
getService
без нажатия на какой-либо виджет? когда я пытаюсь использовать этот код:
class GetServices extends HookWidget {
@override
Widget build(BuildContext context) {
final washing = useProvider(washingServiceProvider.notifier);
washing.getService();
return Scaffold();
...
}
я получаю эту ошибку:
E/flutter ( 3398): [ERROR:flutter/shell/common/shell.cc(103)] Dart Unhandled Exception: setState() or markNeedsBuild() called during build.
E/flutter ( 3398): This UncontrolledProviderScope widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
E/flutter ( 3398): The widget on which setState() or markNeedsBuild() was called was:
E/flutter ( 3398): UncontrolledProviderScope
E/flutter ( 3398): The widget which was currently being built when the offending call was made was:
E/flutter ( 3398): GetServices, stack trace: #0 Element.markNeedsBuild.<anonymous closure> (package:flutter/src/widgets/framework.dart:4217:11)
E/flutter ( 3398): #1 Element.markNeedsBuild (package:flutter/src/widgets/framework.dart:4232:6)
E/flutter ( 3398): #2 ProviderElement._debugMarkWillChange.<anonymous closure> (package:riverpod/src/framework/base_provider.dart:660:16)
E/flutter ( 3398): #3 ProviderElement._debugMarkWillChange (package:riverpod/src/framework/base_provider.dart:664:6)
E/flutter ( 3398): #4 ProviderStateBase.exposedValue=.<anonymous closure> (package:riverpod/src/framework/base_provider.dart:900:16)
E/flutter ( 3398): #5 ProviderStateBase.exposedValue= (package:riverpod/src/framework/base_provider.dart:902:6)
E/flutter ( 3398): #6 _StateNotifierProviderState._listener (package:riverpod/src/state_notifier_provider.dart:92:5)
E/flutter ( 3398): #7 StateNotifier.state= (package:state_notifier/state_notifier.dart:162:31)
E/flutter ( 3398): #8 RequestStateNotifier.makeRequest (package:washing_app/core/service/network/request_state_notifier.dart:10:7)
E/flutter ( 3398): #9 WashingRequestNotifier.getService (package:washing_app/src/screens/dashboard/tabs/category_products/repository/washing_service_repository.dart:98:7)
E/flutter ( 3398): #10 GetServices.build (package:washing_app/src/screens/dashboard/get_services.dart:39:13)
E/flutter ( 3398): #11 StatelessElement.build (package:flutter/src/widgets/framework.dart:4648:28)
E/flutter ( 3398): #12 HookElement.build (package:flutter_hooks/src/framework.dart:417:27)
E/flutter ( 3398): #13 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4574:15)
E/flutter ( 3398): #14 Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
E/flutter ( 3398): #15 StatelessElement.update (package:flutter/src/widgets/framework.dart:4655:5)
E/flutter ( 3398): #16 HookElement.update (package:flutter_hooks/src/framework.dart:379:11)
E/flutter ( 3398): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #18 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4599:16)
E/flutter ( 3398): #19 Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
E/flutter ( 3398): #20 StatelessElement.update (package:flutter/src/widgets/framework.dart:4655:5)
E/flutter ( 3398): #21 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #22 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6090:14)
E/flutter ( 3398): #23 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #24 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4599:16)
E/flutter ( 3398): #25 Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
E/flutter ( 3398): #26 StatelessElement.update (package:flutter/src/widgets/framework.dart:4655:5)
E/flutter ( 3398): #27 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #28 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6090:14)
E/flutter ( 3398): #29 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #30 SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6090:14)
E/flutter ( 3398): #31 Element.updateChild (package:flutter/src/widgets/framework.dart:3350:15)
E/flutter ( 3398): #32 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4599:16)
E/flutter ( 3398): #33 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4746:11)
E/flutter ( 3398): #34 Element.rebuild (package:flutter/src/widgets/framework.dart:4267:5)
E/flutter ( 3398): #35 StatefulElement.up
E/flutter ( 3398): [ERROR:flutter/shell/common/shell.cc(103)] Dart Unhandled Exception: setState() or markNeedsBuild() called during build.
E/flutter ( 3398): This UncontrolledProviderScope widget cannot be marked as needing to build because the framework is already in the process of building widgets. A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
мой определенный провайдер:
final washingServicesRepositoryProvider = Provider((ref) => WashingServiceRepository(ref.read));
final washingServiceProvider =
StateNotifierProvider<WashingRequestNotifier, NetworkRequestState<WashingServicesResponseStructure>>(
(ref) => WashingRequestNotifier(ref.watch(washingServicesRepositoryProvider)));
class WashingServiceRepository {
final Reader _reader;
WashingServiceRepository(this._reader);
Future<WashingServicesResponseStructure> getService() async {
try {
const _r = RetryOptions(maxAttempts: 3);
final _res = await _r.retry(() => _reader(dioProvider)
.post(
Server.$getData,
options: Options(
headers: {'Content-Type': 'application/json'},
),
)
..timeout(const Duration(seconds: 30)),
retryIf: (e) => e is SocketException || e is TimeoutException);
return WashingServicesResponseStructure.fromJson(_res.data as Map<String, dynamic>);
} on DioError catch (error) {
rethrow;
}
}
}
class WashingRequestNotifier extends RequestStateNotifier<WashingServicesResponseStructure> {
final WashingServiceRepository _washingServiceRepository;
WashingRequestNotifier(this._washingServiceRepository);
Future<NetworkRequestState<WashingServicesResponseStructure>> getService() =>
makeRequest(() => _washingServiceRepository.getService());
}