【发布时间】: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>();
【问题讨论】:
标签: flutter dart dependency-injection flutter-provider service-locator