找不到正确的提供者 - Flutter
Could not find the correct Provider - Flutter
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
return false;
},
child: Stack(
children: <Widget>[
DefaultTabController(
length: 5,
child: ChangeNotifierProvider(
builder: (context) => MySchedule(),
child: (
Scaffold(
appBar: AppBar(
actions: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () async{
await Navigator.of(context).push(
MaterialPageRoute(builder: (context){
return InApp();
})
);
final MySchedule schedules = Provider.of<MySchedule>(context);
schedules.numberOfCoins = 10;
},
child: Card(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Consumer<MySchedule>(
builder: (context, coin, _) =>
buildCoinBar(coin),
),
SizedBox(
width: 2,
),
Stack(
children: <Widget>[
Image.asset('assets/coin2.png',
height: 22, width: 22,),
],
),
],
),
),
),
),
Image.asset('assets/LOGO.png'),
Consumer<MySchedule>(
builder: (context, userdata, _) =>
topRightElement(userdata, context),
),
],
),
)
],
automaticallyImplyLeading: false,
bottom: TabBar(
labelStyle: TextStyle(fontSize: 8),
tabs: [
Consumer<MySchedule>(
builder: (context, schedule, _) =>
buildNewCardNotification(schedule),
),
Tab(icon: Icon(Icons.star), text: 'Csapatom' ,),
Tab(icon: Icon(Icons.verified_user), text: 'Forduló',),
Tab(icon: Icon(Icons.stars), text: 'Kártyáim',),
Tab(icon: Icon(Icons.account_balance), text: 'Ligák',),
],
),
),
body: TabBarView(
children: [
Office(),
MyTeam(),
MatchListView(),
MyCardView(),
ChampionshipView2(),
],
),
)
),
),
),
Visibility(
visible: msgVisible,
child: SafeArea(
child: GestureDetector(
onTap: (){
setState(() {
msgVisible = false;
});
},
child: Padding(
padding: const EdgeInsets.all(2.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: Card(
shape: RoundedRectangleBorder(
side: new BorderSide(color: Colors.lightGreenAccent, width: 2.0),
borderRadius: BorderRadius.circular(16.0)),
elevation: 8,
color: Colors.black87,
child: Container(
height: 64,
width: MediaQuery.of(context).size.width,
child: Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: Image.asset('assets/LOGO.png', height:44),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(title, style: TextStyle(
fontSize: 16,
color: Colors.lightGreenAccent
),),
Text(body,
overflow: TextOverflow.ellipsis)
],
),
],
),
),
),
),
),
),
),
)
],
),
);
}
当我弹出 InApp() class 时,我尝试修改 numberOfCoins 变量。
但是我有以下错误:
[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Error: Could
not find the correct Provider above this FantasyNbi Widget
To fix, please:
- Ensure the Provider is an ancestor to this FantasyNbi
Widget * Provide types to Provider * Provide types to
Consumer * Provide types to Provider.of()
- Always use package imports. Ex:
import 'package:my_app/my_code.dart'; * Ensure the correct
context` is
being used.
您需要 ChangeNotifierProvider
和 Scaffold
之间的 builder
桥梁。
提供程序包已经有自己的构建器 Consumer
,您可以像这样使用它:
ChangeNotifierProvider<MySchedule>(
create: (context) => MySchedule(),
child: Consumer<MySchedule>(
builder: (context, provider, child) => Scaffold(....,
检查此 link:https://pub.dev/packages/provider#reading-a-value
编辑:builder
现在是 create
。
根据最新版本的Provider包,ChangeNotifierProvider
的builder()
方法更改为create()
。
所以编辑 Esen Mehmet 的版本,这会起作用:
ChangeNotifierProvider(
create: (context) => MySchedule(), //change builder to create
child: Consumer<MySchedule>(
builder: (context, provider, child) => Scaffold(....,
You can use provider as Below,
class HomeApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return HomeAppState();
}
}
class HomeAppState extends State<HomeApp>{
final _user = UserModel();
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<LoginNotifier>(
create: (BuildContext context) {
return LoginNotifier();
}),
ChangeNotifierProvider<UserModel>.value(value: _user),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: Provider.of<ThemeModel>(context).currentTheme,
home: HomeScreen(),
));
}
}
@override
Widget build(BuildContext context) {
return WillPopScope(
onWillPop: () async {
return false;
},
child: Stack(
children: <Widget>[
DefaultTabController(
length: 5,
child: ChangeNotifierProvider(
builder: (context) => MySchedule(),
child: (
Scaffold(
appBar: AppBar(
actions: <Widget>[
Container(
width: MediaQuery.of(context).size.width,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
GestureDetector(
onTap: () async{
await Navigator.of(context).push(
MaterialPageRoute(builder: (context){
return InApp();
})
);
final MySchedule schedules = Provider.of<MySchedule>(context);
schedules.numberOfCoins = 10;
},
child: Card(
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Row(
children: <Widget>[
Consumer<MySchedule>(
builder: (context, coin, _) =>
buildCoinBar(coin),
),
SizedBox(
width: 2,
),
Stack(
children: <Widget>[
Image.asset('assets/coin2.png',
height: 22, width: 22,),
],
),
],
),
),
),
),
Image.asset('assets/LOGO.png'),
Consumer<MySchedule>(
builder: (context, userdata, _) =>
topRightElement(userdata, context),
),
],
),
)
],
automaticallyImplyLeading: false,
bottom: TabBar(
labelStyle: TextStyle(fontSize: 8),
tabs: [
Consumer<MySchedule>(
builder: (context, schedule, _) =>
buildNewCardNotification(schedule),
),
Tab(icon: Icon(Icons.star), text: 'Csapatom' ,),
Tab(icon: Icon(Icons.verified_user), text: 'Forduló',),
Tab(icon: Icon(Icons.stars), text: 'Kártyáim',),
Tab(icon: Icon(Icons.account_balance), text: 'Ligák',),
],
),
),
body: TabBarView(
children: [
Office(),
MyTeam(),
MatchListView(),
MyCardView(),
ChampionshipView2(),
],
),
)
),
),
),
Visibility(
visible: msgVisible,
child: SafeArea(
child: GestureDetector(
onTap: (){
setState(() {
msgVisible = false;
});
},
child: Padding(
padding: const EdgeInsets.all(2.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(0.0),
child: Card(
shape: RoundedRectangleBorder(
side: new BorderSide(color: Colors.lightGreenAccent, width: 2.0),
borderRadius: BorderRadius.circular(16.0)),
elevation: 8,
color: Colors.black87,
child: Container(
height: 64,
width: MediaQuery.of(context).size.width,
child: Row(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: Image.asset('assets/LOGO.png', height:44),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Text(title, style: TextStyle(
fontSize: 16,
color: Colors.lightGreenAccent
),),
Text(body,
overflow: TextOverflow.ellipsis)
],
),
],
),
),
),
),
),
),
),
)
],
),
);
}
当我弹出 InApp() class 时,我尝试修改 numberOfCoins 变量。 但是我有以下错误:
[VERBOSE-2:ui_dart_state.cc(148)] Unhandled Exception: Error: Could not find the correct Provider above this FantasyNbi Widget
To fix, please:
- Ensure the Provider is an ancestor to this FantasyNbi Widget * Provide types to Provider * Provide types to Consumer * Provide types to Provider.of()
- Always use package imports. Ex:
import 'package:my_app/my_code.dart'; * Ensure the correct
context` is being used.
您需要 ChangeNotifierProvider
和 Scaffold
之间的 builder
桥梁。
提供程序包已经有自己的构建器 Consumer
,您可以像这样使用它:
ChangeNotifierProvider<MySchedule>(
create: (context) => MySchedule(),
child: Consumer<MySchedule>(
builder: (context, provider, child) => Scaffold(....,
检查此 link:https://pub.dev/packages/provider#reading-a-value
编辑:builder
现在是 create
。
根据最新版本的Provider包,ChangeNotifierProvider
的builder()
方法更改为create()
。
所以编辑 Esen Mehmet 的版本,这会起作用:
ChangeNotifierProvider(
create: (context) => MySchedule(), //change builder to create
child: Consumer<MySchedule>(
builder: (context, provider, child) => Scaffold(....,
You can use provider as Below,
class HomeApp extends StatefulWidget {
@override
State<StatefulWidget> createState() {
// TODO: implement createState
return HomeAppState();
}
}
class HomeAppState extends State<HomeApp>{
final _user = UserModel();
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<LoginNotifier>(
create: (BuildContext context) {
return LoginNotifier();
}),
ChangeNotifierProvider<UserModel>.value(value: _user),
],
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: Provider.of<ThemeModel>(context).currentTheme,
home: HomeScreen(),
));
}
}