如何将 get_it 用于 Provider.of<ExampleProvider>(context)?

Posted

技术标签:

【中文标题】如何将 get_it 用于 Provider.of<ExampleProvider>(context)?【英文标题】:How to use get_it for Provider.of<ExampleProvider>(context)? 【发布时间】:2021-10-18 08:38:25 【问题描述】:

我是 Flutter 的新手,我正在尝试将 get_it 包用于 DI。我想了解如何用 get_it 替换对 Inherited Widget 的依赖。 我的代码如下所示:

我有一个定位器文件,它初始化定位器实例及其设置。 locator.dart 文件:

final locator = GetIt.instance;

void setupLocator() 
  locator.registerLazySingleton<ExampleProvider>(() => ExampleProvider());

example_provider.dart:

class ExampleProvider with ChangeNotifier 
  
  bool _value = false;

  bool get value => _value;

  set setValue(bool newValue) 
    _value = newValue;
    notifyListeners();
  


这是为子小部件提供带有 ExampleProvider 的 ChangeNotifierProvider 的主页。

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&lt;ExampleProvider&gt;(context) 的 ExampleWidget

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;
          ,
        );
  


所以,我想在ExampleWidget 中为final _exampleProvider = Provider.of&lt;ExampleProvider&gt;(context); 行使用定位器。我怎样才能做到这一点? 它不能像这样工作:final _exampleProvider = locator.get&lt;ExampleProvider&gt;();

【问题讨论】:

【参考方案1】:

试试这个

    final _exampleProvider = locator.get<ExampleProvider>();

【讨论】:

它不起作用,因为定位器不是一个类。它只是一个实例。它也不接受任何泛型类型。 哎呀,我犯了一个小错误。请再检查一遍。 是的,我已经尝试过了,它不起作用。不知何故,上下文丢失了。 get_it 不需要上下文。你应该将 locator.dart 导入到你的 home_page.dart 中来完成这项工作。 locator.get() 不会在 ExampleProvider 中检索或设置值。

以上是关于如何将 get_it 用于 Provider.of<ExampleProvider>(context)?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter get_it 和 FutureBuilder 无法使用热重载

在 Flutter 文档中,Provider.of 段落的解释

如何对访问 Provider.of(context) 的小部件进行 Flutter 测试

使用 get_it 的 Flutter 依赖注入设置问题

无法使用 Provider.of(context) 调用类方法

使用 get_it 时颤动 bloc 处理