一些供应商无法在模式底部工作 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)