1

问题:在模态底页上方的上下文中找不到我的一些提供程序。例子:

错误:在此 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 > 起作用

4

1 回答 1

2

正如我所看到的,您遇到了错误,因为您的提供程序不在您正在调用的树中,因此最好将所有提供程序包含在其中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(),
    ),
  );
}

我认为这个解决方案适用于你的情况......试试看,让我知道

注意:我可以看到您在提供程序中传递了一些参数,因此只需稍微更改结构并将值分配给您正在初始化它们的提供程序

于 2022-02-21T15:11:41.007 回答