Как использовать get_it для поставщика.(контекст)?

#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.