一些供应商无法在模式底部工作 sheet
Some Providers not working in modal bottom sheet
问题:在模式底部sheet上方的上下文中找不到我的一些提供者。示例:
Error: Could not find the correct Provider above
this ModalEnterTask Widget
This happens because you used a BuildContext
that does not include
the provider of your choice.
所有提供者都明确位于打开模式的小部件上方 sheet。一个提供者实际上正在工作。该应用程序是在 material 应用程序之上创建的。那些不起作用的是在我的选项卡屏幕的构建方法中创建的。我一直在整个应用程序中成功地使用它们。为什么在模态里找不到sheet?
我的理论:用于模态 sheet 的上下文依赖于 Material 应用上下文;不在小部件树中打开它的上下文中。正确吗?
解决方法:不知道。我无法将提供者移动到工作提供者所在的位置。它们需要上下文信息(编辑:MediaQuery 信息,而不是上下文),因此它们不能在 material 应用程序之前初始化。
代码:
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(),这里我初始化了modal中不起作用的Providersheet:
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)
调用模态 sheet:
return GestureDetector(
onTap: () => showModalBottomSheet(
context: context,
builder: (bctx) => ModalEnterTask(positionTask: positionTask),
),
//
child: Center(//container with an icon)
在模态生成器中调用的小部件sheet:
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 > 作品
正如我所看到的,您遇到错误是因为您的提供者不在您调用的树中,因此最好将所有提供者包含在 main
中,您将能够解决此问题。这是你如何做到的
void main() async {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => CustomColors()),
ChangeNotifierProvider(create: (context) => DimensionsProvider()),
ChangeNotifierProvider(create: (context) => MainElementList()),
ChangeNotifierProvider(create: (context) => ScrollControllerToggles()),
],
child: MyApp(),
),
);
}
我认为此解决方案适用于您的情况...尝试一下并告诉我
注意:我可以看到您在提供程序中传递了一些参数,因此只需稍微更改结构并将值分配给您正在初始化它们的提供程序
我在使用方法 showModalBottomSheet 时遇到了同样的错误。
我尝试在作为模态底部 sheet 打开的小部件中使用 BlocBuilder,然后我得到了
BlocProvider.of() called with a context that does not contain a MyBloc
我的解决方案是:
将值作为小部件的参数传递。在我的例子中是:
showModalBottomSheet(
context: context,
builder: (BuildContext btsContext) {
return CartBottomSheetPage(
cartBloc: BlocProvider.of<MyBloc>(context),
);
},
);
注意:您必须像这样从父上下文中获取值:
BlocProvider.of<MyBloc>(context)
不是这样的:
BlocProvider.of<MyBloc>(btsContext)
问题:在模式底部sheet上方的上下文中找不到我的一些提供者。示例:
Error: Could not find the correct Provider above this ModalEnterTask Widget
This happens because you used a
BuildContext
that does not include the provider of your choice.
所有提供者都明确位于打开模式的小部件上方 sheet。一个提供者实际上正在工作。该应用程序是在 material 应用程序之上创建的。那些不起作用的是在我的选项卡屏幕的构建方法中创建的。我一直在整个应用程序中成功地使用它们。为什么在模态里找不到sheet?
我的理论:用于模态 sheet 的上下文依赖于 Material 应用上下文;不在小部件树中打开它的上下文中。正确吗?
解决方法:不知道。我无法将提供者移动到工作提供者所在的位置。它们需要上下文信息(编辑:MediaQuery 信息,而不是上下文),因此它们不能在 material 应用程序之前初始化。
代码:
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(),这里我初始化了modal中不起作用的Providersheet:
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)
调用模态 sheet:
return GestureDetector(
onTap: () => showModalBottomSheet(
context: context,
builder: (bctx) => ModalEnterTask(positionTask: positionTask),
),
//
child: Center(//container with an icon)
在模态生成器中调用的小部件sheet:
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 > 作品
正如我所看到的,您遇到错误是因为您的提供者不在您调用的树中,因此最好将所有提供者包含在 main
中,您将能够解决此问题。这是你如何做到的
void main() async {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => CustomColors()),
ChangeNotifierProvider(create: (context) => DimensionsProvider()),
ChangeNotifierProvider(create: (context) => MainElementList()),
ChangeNotifierProvider(create: (context) => ScrollControllerToggles()),
],
child: MyApp(),
),
);
}
我认为此解决方案适用于您的情况...尝试一下并告诉我
注意:我可以看到您在提供程序中传递了一些参数,因此只需稍微更改结构并将值分配给您正在初始化它们的提供程序
我在使用方法 showModalBottomSheet 时遇到了同样的错误。 我尝试在作为模态底部 sheet 打开的小部件中使用 BlocBuilder,然后我得到了
BlocProvider.of() called with a context that does not contain a MyBloc
我的解决方案是: 将值作为小部件的参数传递。在我的例子中是:
showModalBottomSheet(
context: context,
builder: (BuildContext btsContext) {
return CartBottomSheetPage(
cartBloc: BlocProvider.of<MyBloc>(context),
);
},
);
注意:您必须像这样从父上下文中获取值:
BlocProvider.of<MyBloc>(context)
不是这样的:
BlocProvider.of<MyBloc>(btsContext)