问题:在模态底页上方的上下文中找不到我的一些提供程序。例子:
错误:在此 ModalEnterTask 小部件上方找不到正确的提供程序
发生这种情况是因为您使用了
BuildContext
不包括您选择的提供者的 。
所有提供者都明确地位于打开模式表的小部件之上。一个提供商实际上正在工作。那是在材料应用程序上方创建的。那些不工作是在我的选项卡屏幕的构建方法中创建的。我一直在整个应用程序中成功使用它们。为什么在模态表中找不到它们?
我的理论:用于模态表的上下文取决于 Material 应用程序上下文;不在小部件树中打开它的上下文中。正确的?
解决方案:我不知道。我无法将提供者移动到工作提供者所在的位置。它们需要上下文信息(编辑:MediaQuery 信息,而不是上下文),因此它们无法在材质应用程序之前初始化。
代码:
MyApp 状态...这是我初始化有效提供程序的地方:
class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (context) => MainElementList(widget.mainElementList),
),
ChangeNotifierProvider(
create: (context) => ScrollControllerToggles(),
)
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
title: 'Three Things',
initialRoute: '/',
routes: {
'/': (ctx) => TabsScreen(),
},
),
);
}
}
TabsScreen(),这里我初始化了那些在模态表中不起作用的Provider:
return MultiProvider(
providers: [
ChangeNotifierProvider(
create: (ctx) => CustomColors(customColorScheme),
),
//
ChangeNotifierProvider(
create: (ctx) => DimensionsProvider(
appBarHeight: appBarHeight,
availableHeight: availableHeight,
availableWidth: availableWidth),
),
//
ChangeNotifierProvider(
create: (ctx) => CustomTextStyle(availableHeight, customTextTheme),
),
],
child: Scaffold(//body: function picking pages)
调用模态表:
return GestureDetector(
onTap: () => showModalBottomSheet(
context: context,
builder: (bctx) => ModalEnterTask(positionTask: positionTask),
),
//
child: Center(//container with an icon)
在模态表的构建器中调用的小部件:
class ModalEnterTask extends StatelessWidget {
late String positionTask;
ModalEnterTask({required String this.positionTask, Key? key})
: super(key: key);
@override
Widget build(BuildContext context) {
//RESPONSIVENESS
final availableHeight =
Provider.of<DimensionsProvider>(context).availableHeight;
return Column(
children: [
SizedBox(
height: 10,
),
//
IconButton(
icon: Icon(Icons.plus_one),
onPressed: () {
Provider.of<MainElementList>(context, listen: false)
.changeSingleTaskPhase(0, positionTask);
Navigator.of(context).pop();
},
),
],
);
}
}
DimensionProvider > 不起作用 MainElementList > 起作用