[英]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.