#flutter #dart #dependency-injection #flutter-provider #service-locator
Вопрос:
Я новичок в flutter и пытаюсь использовать пакет get_it для DI. Я хочу понять, как я могу заменить свою зависимость от унаследованного виджета на get_it. Мой код выглядит так:
У меня есть файл локатора, который инициализирует экземпляр локатора и его настройку. локатор.файл для дротиков:
final locator = GetIt.instance;
void setupLocator() {
locator.registerLazySingleton<ExampleProvider>(() => ExampleProvider());
}
пример_провидер.дротик:
class ExampleProvider with ChangeNotifier {
bool _value = false;
bool get value => _value;
set setValue(bool newValue) {
_value = newValue;
notifyListeners();
}
}
Это домашняя страница, на которой предоставьте поставщику изменений с помощью ExampleProvider дочерний виджет.
файл home_page.dart:
class HomePage extends StatefulWidget {
final String title;
const HomePage({Key? key, required this.title}) : super(key: key);
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final _exampleProvider = locator.get<ExampleProvider>();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
key: Key('issue_list_screen_column'),
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.start,
children: [
ChangeNotifierProvider(
create: (context) => _exampleProvider,
child: ExampleWidget(
key: Key('example_widget'),
),
),
],
),
appBar: AppBar(
title: Text(widget.title),
),
);
}
}
Это пример виджета, в котором я хочу использовать локатор вместо Provider.of<ExampleProvider>(context)
файл example_widget.dart:
class ExampleWidget extends StatefulWidget {
const ExampleWidget({
Key? key,
}) : super(key: key);
@override
_ExampleWidgetState createState() => _ExampleWidgetState();
}
class _ExampleWidgetState extends State<ExampleWidget> {
@override
Widget build(BuildContext context) {
// How do I use locator over here with context??
final _exampleProvider = Provider.of<ExampleProvider>(context);
return Switch(
value: _exampleProvider.value,
onChanged: (newValue) {
themeProvider.setValue = newValue;
},
);
}
}
Итак, я хочу использовать локатор для входа в линию final _exampleProvider = Provider.of<ExampleProvider>(context);
ExampleWidget
. Как я могу это сделать?
Это не работает таким образом: final _exampleProvider = locator.get<ExampleProvider>();
Ответ №1:
попробуйте это
final _exampleProvider = locator.get<ExampleProvider>();
Комментарии:
1. Это не работает, потому что локатор не является классом. Это просто пример. Он также не принимает никаких универсальных типов.
2. ой, я совершила небольшую ошибку. Проверьте это еще раз, пожалуйста.
3. Да, я уже пробовал это, это не работает. Контекст как — то отсутствует.
4. get_it не нуждается в контексте. Вам следует импортировать локатор. бросьтесь в свою домашнюю страницу.бросьте, чтобы это сработало.
5. locator.get<ExampleProvider>() не извлекает и не устанавливает значения в ExampleProvider.