Не удалось найти правильный поставщик <User>над этим виджетом - PullRequest
0 голосов
/ 07 мая 2020

Я получаю эту ошибку, когда пытаюсь 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(),

        },
      ),
    );
  }
}
...