【发布时间】:2020-12-14 03:32:03
【问题描述】:
我正在尝试访问上下文,以便我可以读取我的提供程序,但由于此生命周期挂钩位于小部件树之外。它无法访问。有没有办法访问上下文?
【问题讨论】:
-
请提供您已经尝试过的代码清单。
-
您需要提供更广泛的上下文。
标签: flutter flutter-layout flutter-dependencies
我正在尝试访问上下文,以便我可以读取我的提供程序,但由于此生命周期挂钩位于小部件树之外。它无法访问。有没有办法访问上下文?
【问题讨论】:
标签: flutter flutter-layout flutter-dependencies
我研究了一下,最后和flutter bloc社区的narcodico讨论了,所以学分是他的。
因此,在状态类上混入WidgetsBindingObserver,context 甚至在 didChangeAppLifecycleState 这样的覆盖中也可用,因为它们是状态类的一部分。
另外,请考虑移动到状态小部件上方的 BlocProvider。
例子
class HomePageProvider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider(
create: (context) => getIt<InAppPurchasesBloc>(),
child: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _HomePageState();
}
}
class _HomePageState extends State<HomePage> with WidgetsBindingObserver {
...
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
context
.read<InAppPurchasesBloc>()
.add(const InAppPurchasesEvent.getPurchaserInfo());
}
}
...
}
【讨论】:
恐怕您无法访问 didChangeAppLifecycleState 中的上下文。
【讨论】:
对于任何感兴趣的人,您可以将脚手架状态保存在全局键中,并从其当前状态访问上下文。
【讨论】:
final GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey<ScaffoldState>(); 然后你可以像 `_scaffoldKey.currentState.context.read....` 一样访问它,确保你将你的密钥添加到 Scaffold 小部件
你可以使用useEffect函数,阅读更多:
https://pub.dev/documentation/flutter_hooks/latest/flutter_hooks/useEffect.html;
Widget build(BuildContext context) {
useEffect(() {
//what would you write in initState
},
);
【讨论】:
您可以考虑使用Riverpod 包而不是Provider。 Riverpod 与 Provider 出自同一作者,被认为是“更好的 Provider”,但有许多改进,包括 Flutter 独立性,这意味着它不依赖上下文来工作,您可以使用几乎与 provider 相同的方式。
使用 Riverpod 和 Flutter Hooks,您可以执行以下操作:
// create a provider in a global context
final myProvider = Provider((ref) => myClass());
// access the provider inside your class
class MyWidget extends HookWidget{
//access the provider using a hook
final myClassProvider = useProvider(myProvider);
//... your logic
@override
Widget build (BuildContext context){/* ... build widget tree... */}
}
考虑this very useful and concise tutorial 如何将 Riverpod 与 Flutter Hooks 和 StateNotifier、ChangeNotifier 等一起使用...
【讨论】: