Я получаю эту ошибку, когда пытаюсь go перейти на другой экран в моем приложении
У меня есть экран, который представляет собой список пользователей в списке, и у каждого пользователя есть свой c пользователь profile, который является другим экраном, поэтому, когда я выбираю определенного c пользователя в списке, он должен go перейти на экран профиля без каких-либо ошибок, но когда я пытаюсь это сделать, он выдает ошибку:
ЭТО ОШИБКА
════════ Исключение, обнаруженное библиотекой виджетов ══════════════════════. ═════════════════════════════ = Приведена следующая ошибка ProviderNotFoundError Строитель (грязный): Ошибка: не удалось найти правильный поставщик над этим виджетом ListUsers
Чтобы исправить:
- Убедитесь, что провайдер является предком этого виджета ListUsers
- Укажите типы для провайдера
- Предоставьте типы потребителю
- Предоставьте типы Provider.of ()
- Всегда используйте импорт пакетов. Пример: `import 'package: my_app / my_code.dart';
- Убедитесь, что используется правильный
context
.
Это функция из моего списка экран пользователей (вы можете найти весь код ниже)
_buildUserTile(User user) {
return ListTile(
leading: CircleAvatar(
radius: 30.0,
backgroundImage: user.profileImageUrl.isEmpty
? AssetImage('assets/images/mimi2.gif')
: CachedNetworkImageProvider(user.profileImageUrl),
),
title: Text(user.nickname),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ProfileScreen(
currentUserId: Provider.of<UserData>(context).currentUserId,
userId: user.id,
),
),
),
);
}
это мой список пользователей на экране просмотра списка
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:jobly10/models/user_data.dart';
import 'package:jobly10/screens/CategoryUsers.dart';
import 'package:jobly10/screens/home_routes.dart';
import 'package:jobly10/screens/profile_screen.dart';
import 'package:provider/provider.dart';
import '../checkifsignedupornot.dart';
import '../models/user_model.dart';
class ListUsers extends StatefulWidget {
static final String id = 'users';
final String currentUserId;
ListUsers({this.currentUserId});
@override
_SearchScreenState createState() => _SearchScreenState();
}
class _SearchScreenState extends State<ListUsers> {
///METODO PARA DISEÑO DE LA LISTA DE USER THE LA COLECCION "USER" EN CLOUD FIRESTORE
_buildUserTile(User user) {
return ListTile(
leading: CircleAvatar(
radius: 30.0,
backgroundImage: user.profileImageUrl.isEmpty
? AssetImage('assets/images/mimi2.gif')
: CachedNetworkImageProvider(user.profileImageUrl),
),
title: Text(user.nickname),
onTap: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ProfileScreen(
currentUserId: Provider.of<UserData>(context).currentUserId,
userId: user.id,
),
),
),
);
}
///BUILD THE LIST USER UI AND CALLING THE METHODS
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: InkWell(
onTap: () {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) {
return CheckingLogin();
},
),
ModalRoute.withName('/'),
);
},
child: Center(
child: Text('Back'),
),
),
),
body: Container(
child: StreamBuilder(
///IF YOU WANT TO CHANGE THE COLECCTION LIST THIS IS THE PLACE TO DO IT
stream: Firestore.instance.collection('users').snapshots(),
builder: (context, snapshot) {
///THIS IS THE PLACE WHEN YOU CAN ADD AN ANIMATION
if (!snapshot.hasData) return const Text('Loading...');
return ListView.builder(
itemExtent: 100.0,
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) {
User user = User.fromDoc(snapshot.data.documents[index]);
return _buildUserTile(user);
},
);
},
),
),
);
}
}
class ListTecnicos extends StatefulWidget {
static final String id = 'tecnicos';
final String currentUserId;
ListTecnicos({this.currentUserId});
@override
_ListTecnicosState createState() => _ListTecnicosState();
}
///METODO PARA DISEÑO DE LA LISTA DE USER THE LA COLECCION "TECNICOS" EN CLOUD FIRESTORE
class _ListTecnicosState extends State<ListTecnicos> {
_buildUserTile(User user) {
return ListTile(
leading: CircleAvatar(
radius: 20.0,
backgroundImage: user.profileImageUrl.isEmpty
? AssetImage('assets/images/mimi2.gif')
: CachedNetworkImageProvider(user.profileImageUrl),
),
title: Text(user.nickname),
);
}
///BUILD THE LIST TECNICOS UI
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
leading: InkWell(
onTap: () {
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(
builder: (context) {
return CategoryScreen();
},
),
ModalRoute.withName('/'),
);
},
child: Center(
child: Text('Back'),
),
),
),
body: StreamBuilder(
stream: Firestore.instance.collection('tecnicos').snapshots(),
builder: (context, snapshot) {
if (!snapshot.hasData) return const Text('Loading...');
return ListView.builder(
itemExtent: 80.0,
itemCount: snapshot.data.documents.length,
itemBuilder: (BuildContext context, int index) {
User user = User.fromDoc(snapshot.data.documents[index]);
return _buildUserTile(user);
},
);
}),
);
}
}
Это экран профиля
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:jobly10/chat_implementation/ListChat_screen.dart';
import 'package:jobly10/models/user_data.dart';
import 'package:jobly10/models/user_model.dart';
import 'package:jobly10/screens/users_list.dart';
import 'package:jobly10/services/database_service.dart';
import 'package:jobly10/utilities/constants.dart';
import 'package:provider/provider.dart';
import 'edit_profile_screen.dart';
class ProfileScreen extends StatefulWidget {
static final String id = 'profile_screen';
final String currentUserId;
final String userId;
ProfileScreen({this.currentUserId, this.userId});
@override
_ProfileScreenState createState() => _ProfileScreenState();
}
class _ProfileScreenState extends State<ProfileScreen> {
bool _isFollowing = false;
int _followerCount = 0;
int _followingCount = 0;
// List<Post> _posts = [];
int _displayPosts = 0; // 0 - grid, 1 - column
User _profileUser;
@override
void initState() {
_setupProfileUser();
super.initState();
_setupIsFollowing();
_setupFollowers();
_setupFollowing();
// _setupPosts();
}
_setupIsFollowing() async {
bool isFollowingUser = await DatabaseService.isFollowingUser(
currentUserId: widget.currentUserId,
userId: widget.userId,
);
setState(() {
_isFollowing = isFollowingUser;
});
}
_setupFollowers() async {
int userFollowerCount = await DatabaseService.numFollowers(widget.userId);
setState(() {
_followerCount = userFollowerCount;
});
}
_setupFollowing() async {
int userFollowingCount = await DatabaseService.numFollowing(widget.userId);
setState(() {
_followingCount = userFollowingCount;
});
}
// _setupPosts() async {
// List<Post> posts = await DatabaseService.getUserPosts(widget.userId);
// setState(() {
// _posts = posts;
// });
// }
_setupProfileUser() async {
User profileUser = await DatabaseService.getUserWithId(widget.userId);
setState(() {
_profileUser = profileUser;
});
}
_followOrUnfollow() {
if (_isFollowing) {
_unfollowUser();
} else {
_followUser();
}
}
_unfollowUser() {
DatabaseService.unfollowUser(
currentUserId: widget.currentUserId,
userId: widget.userId,
);
setState(() {
_isFollowing = false;
_followerCount--;
});
}
_followUser() {
DatabaseService.followUser(
currentUserId: widget.currentUserId,
userId: widget.userId,
);
setState(() {
_isFollowing = true;
_followerCount++;
});
}
_displayButton(User user) {
return user.id == Provider.of<UserData>(context).currentUserId
? Container(
width: 200.0,
child: FlatButton(
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
builder: (_) => EditProfileScreen(
user: user,
),
),
),
color: Colors.deepPurpleAccent,
textColor: Colors.white,
child: Text(
'Editar Pefil',
style: TextStyle(fontSize: 18.0, fontFamily: 'Varela'),
),
),
)
: Container(
width: 200.0,
child: FlatButton(
onPressed: _followOrUnfollow,
color: _isFollowing ? Colors.grey[200] : Colors.blue,
textColor: _isFollowing ? Colors.black : Colors.white,
child: Text(
_isFollowing ? 'Unfollow' : 'Follow',
style: TextStyle(fontSize: 18.0),
),
),
);
}
_buildProfileInfo(User user) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(30.0, 30.0, 30.0, 0.0),
child: Row(
children: <Widget>[
CircleAvatar(
radius: 50.0,
backgroundColor: Colors.grey,
backgroundImage: user.profileImageUrl.isEmpty
? AssetImage('assets/images/paisaje.jpg')
: CachedNetworkImageProvider(user.profileImageUrl),
),
Expanded(
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
// Column(
// children: <Widget>[
// Text(
// _posts.length.toString(),
// style: TextStyle(
// fontSize: 18.0,
// fontWeight: FontWeight.w600,
// ),
// ),
// Text(
// 'posts',
// style: TextStyle(color: Colors.black54),
// ),
// ],
// ),
Column(
children: <Widget>[
Text(
_followerCount.toString(),
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w600,
),
),
Text(
'followers',
style: TextStyle(color: Colors.black54),
),
],
),
Column(
children: <Widget>[
Text(
_followingCount.toString(),
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.w600,
),
),
Text(
'following',
style: TextStyle(color: Colors.black54),
),
],
),
],
),
_displayButton(user),
],
),
)
],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 30.0, vertical: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
user.nickname,
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 5.0),
// Container(
// height: 80.0,
// child: StreamBuilder(
// stream: Firestore.instance.collection('users').snapshots(),
// builder: (context, snapshot) {
// if (!snapshot.hasData) {
// return Center(
// child: CircularProgressIndicator(
// valueColor: AlwaysStoppedAnimation<Color>(themeColor),
// ),
// );
// } else {
// return ListView.builder(
// padding: EdgeInsets.all(10.0),
// itemBuilder: (context, index) =>
// gasaa(context, snapshot.data.documents[index]),
// itemCount: snapshot.data.documents.length,
// );
// }
// },
// ),
// ),
Divider(),
],
),
),
],
);
}
///this
// Widget gasaa(BuildContext context, DocumentSnapshot document) {
// return FlatButton(
// child: Text('message'),
// onPressed: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (context) => Chat(
// peerId: document.documentID,
// peerAvatar: document['photoUrl'],
// ),
// ),
// );
// },
// );
// }
_buildToggleButtons() {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
IconButton(
icon: Icon(Icons.grid_on),
iconSize: 30.0,
color: _displayPosts == 0
? Theme.of(context).primaryColor
: Colors.grey[300],
onPressed: () => setState(() {
_displayPosts = 0;
}),
),
IconButton(
icon: Icon(Icons.list),
iconSize: 30.0,
color: _displayPosts == 1
? Theme.of(context).primaryColor
: Colors.grey[300],
onPressed: () => setState(() {
_displayPosts = 1;
}),
),
],
);
}
// _buildTilePost(Post post) {
// return GridTile(
// child: GestureDetector(
// onTap: () => Navigator.push(
// context,
// MaterialPageRoute(
// builder: (_) => CommentsScreen(
// post: post,
// likeCount: post.likeCount,
// ),
// ),
// ),
// child: Image(
// image: CachedNetworkImageProvider(post.imageUrl),
// fit: BoxFit.cover,
// ),
// ),
// );
// }
// _buildDisplayPosts() {
// if (_displayPosts == 0) {
// // Grid
// List<GridTile> tiles = [];
// _posts.forEach(
// (post) => tiles.add(_buildTilePost(post)),
// );
// return GridView.count(
// crossAxisCount: 3,
// childAspectRatio: 1.0,
// mainAxisSpacing: 2.0,
// crossAxisSpacing: 2.0,
// shrinkWrap: true,
// physics: NeverScrollableScrollPhysics(),
// children: tiles,
// );
// } else {
// // Column
// List<PostView> postViews = [];
// _posts.forEach((post) {
// postViews.add(
// PostView(
// currentUserId: widget.currentUserId,
// post: post,
// author: _profileUser,
// ),
// );
// });
// return Column(children: postViews);
// }
// }
// Future<bool> _onBackPress() {
// return showDialog(
// context: context,
// builder: (context) => AlertDialog(
// title: Text('Go to the last page?'),
// actions: <Widget>[
// FlatButton(
// child: Text('no'),
// onPressed: () => Navigator.pop(context, false),
// ),
// FlatButton(
// child: Text('yes'),
// onPressed: () => Navigator.pop(context, true),
// )
// ],
// ),
// );
// }
void _moveToSignInScreen(BuildContext context) => Navigator.push(
context,
MaterialPageRoute(
builder: (context) {
return ListUsers();
},
),
);
@override
Widget build(BuildContext context) {
return new Scaffold(
// appBar: (new AppBar(
// leading: IconButton(
// icon: Icon(Icons.exit_to_app),
// onPressed: () => Navigator.of(context).pop(),
// ),
// )),
body: FutureBuilder(
future: usersRef.document(widget.userId).get(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(),
);
}
User user = User.fromDoc(snapshot.data);
return ListView(
children: <Widget>[
_buildProfileInfo(user),
_buildToggleButtons(),
Divider(),
// _buildDisplayPosts(),
],
);
},
),
);
}
}
class Builssd {
static buildProfileInfo(User user) {
return Column(
children: <Widget>[
Padding(
padding: EdgeInsets.fromLTRB(30.0, 30.0, 30.0, 0.0),
child: Row(
children: <Widget>[
CircleAvatar(
radius: 50.0,
backgroundColor: Colors.grey,
backgroundImage: user.profileImageUrl.isEmpty
? AssetImage('assets/images/paisaje.jpg')
: CachedNetworkImageProvider(user.profileImageUrl),
),
Expanded(
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
// Column(
// children: <Widget>[
// Text(
// _posts.length.toString(),
// style: TextStyle(
// fontSize: 18.0,
// fontWeight: FontWeight.w600,
// ),
// ),
// Text(
// 'posts',
// style: TextStyle(color: Colors.black54),
// ),
// ],
// ),
Column(
children: <Widget>[
Text(
'followers',
style: TextStyle(color: Colors.black54),
),
],
),
],
),
],
),
)
],
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 30.0, vertical: 10.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
user.nickname,
style: TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold,
),
),
SizedBox(height: 5.0),
// Container(
// height: 80.0,
// child: StreamBuilder(
// stream: Firestore.instance.collection('users').snapshots(),
// builder: (context, snapshot) {
// if (!snapshot.hasData) {
// return Center(
// child: CircularProgressIndicator(
// valueColor: AlwaysStoppedAnimation<Color>(themeColor),
// ),
// );
// } else {
// return ListView.builder(
// padding: EdgeInsets.all(10.0),
// itemBuilder: (context, index) =>
// gasaa(context, snapshot.data.documents[index]),
// itemCount: snapshot.data.documents.length,
// );
// }
// },
// ),
// ),
Divider(),
],
),
),
],
);
}
}
ИЗМЕНИТЬ ЭТО КАК Я ИСПРАВИЛ ЭТУ ПРОБЛЕМУ 05-08-2020
, если вы знаете лучший способ исправьте эту проблему, оставьте свои комментарии ниже.
Я перешел в свой основной файл и обернул materialApp
с помощью ChangeNotifierProvider, а затем я создал поставщика UserData
, который позже будет использоваться в моем экране списка пользователей файл, о котором я упоминал выше, см. образец ниже:
Благодарность: Viren V Varasadiya за помощь в решении этой проблемы
НЕПРАВИЛЬНОЕ РЕАЛИЗАЦИЯ
void main () => runApp (DaddyClass ());
class DaddyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: WelcomeScreen(),
);
}
}
ПРАВИЛЬНАЯ РЕАЛИЗАЦИЯ
class DaddyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => UserData(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryIconTheme: Theme.of(context).primaryIconTheme.copyWith(
//color: Colors.white,
),
),
home: WelcomeScreen(),
routes: {
Login.id: (context) => Login(),
},
),
);
}
}
ЦЕЛЫЙ C ODE ИЗ МОЕГО ГЛАВНОГО ФАЙЛА
import 'package:flutter/material.dart';
import 'package:jobly10/models/user_data.dart';
import 'package:jobly10/screens/intro.dart';
import 'package:jobly10/screens/login.dart';
import 'package:provider/provider.dart';
void main() => runApp(DaddyClass());
class DaddyClass extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => UserData(),
child: MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primaryIconTheme: Theme.of(context).primaryIconTheme.copyWith(
//color: Colors.white,
),
),
home: WelcomeScreen(),
routes: {
Login.id: (context) => Login(),
},
),
);
}
}