简体   繁体   English

提供程序在屏幕上调用小部件时出错

[英]Provider gives error when calling a widget on the screen

to make it simple, I'm creating a dashboard where I have a Drawer on the left side of the screen and Another widget that will change based on what the user will choose from Drawer.为了简单起见,我正在创建一个仪表板,其中我在屏幕左侧有一个Drawer ,另一个小部件会根据用户从抽屉中选择的内容而改变。 Anyway, After adding the onPressed for a menu item, when I press to re-call a new widget next to the drawer I'm getting this error:无论如何,在为菜单项添加onPressed之后,当我按下以重新调用抽屉旁边的新小部件时,出现此错误:

Could not find the correct provider<MenuController$> above MainScreen Widget.

So first this is my main.dart :所以首先这是我的main.dart

    import 'package:admin/constants.dart';
import 'package:admin/controllers/MenuController.dart';
import 'package:admin/screens/dashboard/dashboard_screen.dart';
import 'package:admin/screens/main/main_screen.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Admin Panel',
      theme: ThemeData.dark().copyWith(
        scaffoldBackgroundColor: bgColor,
        textTheme: GoogleFonts.poppinsTextTheme(Theme.of(context).textTheme)
            .apply(bodyColor: Colors.white),
        canvasColor: secondaryColor,
      ),
      home: MultiProvider(
        providers: [
          ChangeNotifierProvider(
            create: (context) => MenuController(),
          ),
        ],
        child: MainScreen(DashboardScreen()),,
      ),
    );
  }
}

and this is my MenuController :这是我的MenuController

    import 'package:flutter/material.dart';

class MenuController extends ChangeNotifier {
  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  GlobalKey<ScaffoldState> get scaffoldKey => _scaffoldKey;

  void controlMenu() {
    if (!_scaffoldKey.currentState.isDrawerOpen) {
      _scaffoldKey.currentState.openDrawer();
    }
  }
}

and this is my main_screen :这是我的main_screen

    import 'package:admin/controllers/MenuController.dart';
import 'package:admin/responsive.dart';
import 'package:admin/screens/dashboard/dashboard_screen.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'components/side_menu.dart';

class MainScreen extends StatefulWidget {
  Widget newWidget;
  MainScreen(this.newWidget);
  @override
  State<MainScreen> createState() => _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      key: context.read<MenuController>().scaffoldKey,
      drawer: SideMenu(),
      body: SafeArea(
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            // We want this side menu only for large screen
            if (Responsive.isDesktop(context))
              Expanded(
                // default flex = 1
                // and it takes 1/6 part of the screen
                child: SideMenu(),
              ),
            Expanded(
              // It takes 5/6 part of the screen
              flex: 5,
              child: DashboardScreen(),
            ),
          ],
        ),
      ),
    );
  }
}

and finally this is my side_menu :最后这是我的side_menu

DrawerListTile(
          title: "Fournisseurs",
          svgSrc: "assets/icons/menu_tran.svg",
          subTitle1: 'Ajouter Un Fournisseur',
          subTitle2: 'Liste Des Fournisseurs',
          subTitle3: '---------',
          press1: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => MainScreen(Text('Hello'))),
            );
          },

After clicking on this in my Drawer I'm getting the error listed above.在我的Drawer中单击此按钮后,出现上面列出的错误。

As the error states, the correct provider isn't found above the MainScreen Widget.正如错误所述,在 MainScreen Widget 上方找不到正确的提供程序。

See if it helps to structure your main.dart like this:看看它是否有助于像这样构建您的 main.dart:

import 'package:admin/constants.dart';
import 'package:admin/controllers/MenuController.dart';
import 'package:admin/screens/dashboard/dashboard_screen.dart';
import 'package:admin/screens/main/main_screen.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:provider/provider.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider(
          create: (context) => MenuController(),
        ),
      ],
      child: MaterialApp(
        debugShowCheckedModeBanner: false,
        title: 'Flutter Admin Panel',
        theme: ThemeData.dark().copyWith(
          scaffoldBackgroundColor: bgColor,
          textTheme: GoogleFonts.poppinsTextTheme(Theme.of(context).textTheme)
              .apply(bodyColor: Colors.white),
          canvasColor: secondaryColor,
        ),
        home: MainScreen(DashboardScreen()),
      ),
    );
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Flutter Provider:为什么调用Provider.of时会出现这个错误<widget> (上下文)像 tihis:</widget> - Flutter Provider: Why does this error happens when calling Provider.of<Widget>(context) like tihis: Flutter 提供程序错误:当继承的小部件更改时 - Flutter provider error: When an inherited widget changes 在 Widget build() 之外调用 Navigator 会出现上下文错误 - Calling Navigator outside Widget build() gives context error 调用 showSlideDialog 时上下文和提供程序出错 - having an error with context & provider when calling a showSlideDialog 从一个屏幕调用小部件时出错,而从另一个屏幕调用相同的小部件时没有错误 - Error calling a widget from one Screen while no erro calling the same widget from another 当屏幕未从 Firebase 调用数据时如何显示文本小部件 - How to show a text widget when a screen is not calling data from Firebase Flutter 使用 Provider 时出现“EditableText 上方不存在覆盖小部件”错误 - Flutter 'No Overlay widget exists above EditableText' error when using Provider 在小部件树外调用提供者方法 - Calling a provider method outside the widget tree 使用提供程序在无状态小部件中调用 dispose function - Calling dispose function in stateless widget using provider 更改通知提供程序以将小部件添加到收藏屏幕 - Change Notifier Provider to add widget to Favourite Screen
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM