Я знаю, что уже есть два сообщения по этому вопросу, но я не мог решить свою проблему, глядя на них. Возможно, потому что в моем случае проблема в другом.
Код следующий. Я хочу загрузить некоторые данные из базы данных, показывая страницу загрузки. После загрузки данных я инициализирую провайдера с загруженными данными, а затем перехожу на другую страницу. Этот код не обязательно должен быть в StatefulWidget, но я пытаюсь поместить его в StatefulWidget для решения проблемы, но безуспешно.
class _InitDBDataState extends State<_InitDBData> {
@override
Widget build(BuildContext context) {
_fetchData(context);
return const Center(child: const CircularProgressIndicator());
}
Future<void> _fetchData(BuildContext context) async {
print('fetching data...');
print('context: $context');
final initData = await DBService.service.getInitialData();
print('Data fetched');
print('context: $context');
Provider.of<DataProvider>(context, listen: false).init(initData);
Navigator.of(context).pushReplacementNamed(MainScreen.routeName);
}
}
У меня нет ошибок, если приложение запускается с нуля , но когда я выполняю «горячую перезагрузку», я часто получаю следующую ошибку, и это раздражает, так как мне нужно перезапускать приложение для каждого небольшого изменения в коде.
I/flutter ( 9596): fetching data...
I/flutter ( 9596): context: _InitDBData(dirty, state: _InitDBDataState#46860)
I/flutter ( 9596): fetching data...
I/flutter ( 9596): context: _InitDBData(dirty, state: _InitDBDataState#55124)
I/flutter ( 9596): Data fetched
I/flutter ( 9596): context: _InitDBData
E/flutter ( 9596): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: Looking up a deactivated widget's ancestor is unsafe.
E/flutter ( 9596): At this point the state of the widget's element tree is no longer stable.
E/flutter ( 9596): To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.
E/flutter ( 9596): #0 Element._debugCheckStateIsActiveForAncestorLookup.<anonymous closure>
package:flutter/…/widgets/framework.dart:3508
E/flutter ( 9596): #1 Element._debugCheckStateIsActiveForAncestorLookup
package:flutter/…/widgets/framework.dart:3522
E/flutter ( 9596): #2 Element.getElementForInheritedWidgetOfExactType
package:flutter/…/widgets/framework.dart:3588
E/flutter ( 9596): #3 Provider.of
package:provider/src/provider.dart:221
E/flutter ( 9596): #4 _InitDBDataState._fetchData
package:productive_diary/initScreen.dart:46
E/flutter ( 9596): <asynchronous suspension>
E/flutter ( 9596): #5 _InitDBDataState.build
Я не Я не знаю, почему «выборка данных ...» печатается дважды, и я понятия не имею, как решить проблему.
Я думал, что проблема была решена с помощью решения Саман Салехи , но работая в режиме отладки, у меня было то же исключение в функции _fetchData, которое теперь вызывается в функции initState ()
Exception has occurred.
FlutterError (Looking up a deactivated widget's ancestor is unsafe.
At this point the state of the widget's element tree is no longer stable.
To safely refer to a widget's ancestor in its dispose() method, save a reference to the ancestor by calling dependOnInheritedWidgetOfExactType() in the widget's didChangeDependencies() method.)
Я получил другую ошибку после применения изменений, предложенных Stew ie Griffin .
The ошибка на линии Provider.of<DataProvider>(context, listen: false).init(initData);
Я получил это во время горячей перезагрузки. Кажется, он встречается реже, чем другая ошибка, поэтому ответ Stew ie Griffin определенно улучшил стабильность моего Stew ie Griffin
E/flutter (23815): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The getter 'owner' was called on null.
E/flutter (23815): Receiver: null
E/flutter (23815): Tried calling: owner
E/flutter (23815): #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:53:5)
E/flutter (23815): #1 Provider.of
package:provider/src/provider.dart:193
E/flutter (23815): #2 _InitDBDataState._fetchData
package:productive_diary/initScreen.dart:49
E/flutter (23815): <asynchronous suspension>
E/flutter (23815): #3 _InitDBDataState.initState
Не могли бы вы мне помочь?