【问题标题】:How to use get_it for Provider.of<ExampleProvider>(context)?如何将 get_it 用于 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;();

【问题讨论】:

    标签: flutter dart dependency-injection flutter-provider service-locator


    【解决方案1】:

    试试这个

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

    【讨论】:

    • 它不起作用,因为定位器不是一个类。它只是一个实例。它也不接受任何泛型类型。
    • 哎呀,我犯了一个小错误。请再检查一遍。
    • 是的,我已经尝试过了,它不起作用。不知何故,上下文丢失了。
    • get_it 不需要上下文。你应该将 locator.dart 导入到你的 home_page.dart 中来完成这项工作。
    • locator.get() 不会在 ExampleProvider 中检索或设置值。
    猜你喜欢
    • 2020-09-27
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2020-02-19
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多