如何将 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<ExampleProvider>(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<ExampleProvider>(context);
行使用定位器。我怎样才能做到这一点?
它不能像这样工作:final _exampleProvider = locator.get<ExampleProvider>();
【问题讨论】:
【参考方案1】:试试这个
final _exampleProvider = locator.get<ExampleProvider>();
【讨论】:
它不起作用,因为定位器不是一个类。它只是一个实例。它也不接受任何泛型类型。 哎呀,我犯了一个小错误。请再检查一遍。 是的,我已经尝试过了,它不起作用。不知何故,上下文丢失了。 get_it 不需要上下文。你应该将 locator.dart 导入到你的 home_page.dart 中来完成这项工作。 locator.get以上是关于如何将 get_it 用于 Provider.of<ExampleProvider>(context)?的主要内容,如果未能解决你的问题,请参考以下文章
Flutter get_it 和 FutureBuilder 无法使用热重载
在 Flutter 文档中,Provider.of 段落的解释
如何对访问 Provider.of(context) 的小部件进行 Flutter 测试