Получатель imgUrl был вызван на нуль - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу получить значение (profile.imgUrl) из Firestore, но я получаю ошибку: получатель 'imgUrl' был вызван для null. Получатель: null Пробный вызов: imgUrl

Несмотря на то, что пользователь вошел в систему, и я могу получить данные на домашней странице, но когда я перехожу на страницу учетной записи, она выдает мне эту ошибку.

class Account extends StatelessWidget {
final Profile profile;
Account({this.profile});

final AuthService _auth = AuthService();

@override
Widget build(BuildContext context) {


print(profile.imgUrl);

return StreamProvider<List<Profile>>.value(
  value: DatabaseService().profiles,
  child: Scaffold(
      body: Stack(
    children: <Widget>[
      ClipPath(
        child: Container(
          color: Colors.green.withOpacity(0.8),
        ),
        clipper: getClipper(),
      ),
      Positioned(
        width: 400,
        top: MediaQuery.of(context).size.height / 5,
        child: Column(
          children: <Widget>[
            Container(
              width: 150.0,
              height: 150.0,
              decoration: BoxDecoration(
                  color: Colors.green,
                  image: DecorationImage(
                      image: NetworkImage(profile.imgUrl),
                      fit: BoxFit.cover),
                  borderRadius: BorderRadius.all(Radius.circular(75.0)),
                  boxShadow: [
                    BoxShadow(blurRadius: 7.0, color: Colors.black)
                  ]),
            ),
            SizedBox(
              height: 90.0,
            ),
            Text(
              'Alex Ali',
              style: TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 30.0,
                  fontFamily: 'Montserrat',
                  letterSpacing: 1.5),
            ),
            SizedBox(
              height: 15.0,
            ),
            Text(
              'New Seller',
              style: TextStyle(
                  fontStyle: FontStyle.italic,
                  fontSize: 17.0,
                  color: Colors.green),
            ),
            SizedBox(
              height: 25,
            ),
            Container(
              height: 30.0,
              width: 95.0,
              child: Material(
                borderRadius: BorderRadius.circular(20.0),
                shadowColor: Colors.greenAccent,
                color: Colors.green,
                elevation: 7.0,
                child: GestureDetector(
                  onTap: () {
                    print(profile.imgUrl);
                  },
                  child: Center(
                    child: Text(
                      'Edit Name',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            ),
            SizedBox(
              height: 25,
            ),
            Container(
              height: 30.0,
              width: 95.0,
              child: Material(
                borderRadius: BorderRadius.circular(20.0),
                shadowColor: Colors.redAccent,
                color: Colors.red,
                elevation: 7.0,
                child: GestureDetector(
                  onTap: () async {
                    await _auth.signOut();
                  },
                  child: Center(
                    child: Text(
                      'Log out',
                      style: TextStyle(color: Colors.white),
                    ),
                  ),
                ),
              ),
            )
          ],
        ),
      )
    ],
  )

      ),
  );
  }
  }

 class getClipper extends CustomClipper<Path> {
 @override
 Path getClip(Size size) {
 var path = new Path();

 path.lineTo(0.0, size.height / 1.9);
 path.lineTo(size.width + 125, 0.0);
 path.close();
 return path;
}

@override
bool shouldReclip(CustomClipper<Path> oldClipper) {
 return true;
}
}

и это код домашней страницы:

class Home extends StatefulWidget {
@override
_Home createState() => _Home();
}

class _Home extends State<Home> {
final AuthService _auth = AuthService();

@override
Widget build(BuildContext context) {
return StreamProvider<List<Profile>>.value(
  value: DatabaseService().profiles,
  child: Scaffold(


    body: SafeArea(
      child: ListView(
        padding: EdgeInsets.symmetric(vertical: 30.0),
        children: <Widget>[
          Padding(
            padding: EdgeInsets.only(left: 20.0, right: 120.0),
            child: Text(
              "What would you like to find?",
              style: TextStyle(fontSize: 30, fontWeight: FontWeight.bold),
            ),
          ),
          SizedBox(height: 20.0),

          SizedBox(
            height: 20.0,
          ),
          SizedBox(height: 500, child: ProfileList()),
        ],
      ),
    ),
   ),
  );
  }
  }

Вот код, который открывает страницу учетной записи через BottomNavigationBar:

class Wrapper extends StatefulWidget {
@override
_WrapperState createState() => _WrapperState();
}

class _WrapperState extends State<Wrapper> {
int _currentTab = 0;

final _page = [
Home(),
Search(),
Account(),
];

@override
Widget build(BuildContext context) {
final user = Provider.of<User>(context);
print(user);

if (user == null) {
  return Authenticate();
} else {
  return Scaffold(
    body: _page[_currentTab],
    bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentTab,
        onTap: (int value) {
          setState(() {
            _currentTab = value;
          });
        },
        items: [
          BottomNavigationBarItem(
              icon: Icon(
                Icons.home,
                size: 30.0,
              ),
              title: SizedBox.shrink()),
          BottomNavigationBarItem(
              icon: Icon(
                Icons.search,
                size: 30.0,
              ),
              title: SizedBox.shrink()),
          BottomNavigationBarItem(
            icon: Icon(
              Icons.person,
              size: 30.0,
            ),
            title: SizedBox.shrink(),
          )
        ]),
  );
  }
  }
  }

1 Ответ

0 голосов
/ 25 февраля 2020

Вам нужно передать Profile в качестве параметра при создании Account.
Это должно быть сделано динамически, поэтому вы не можете использовать фиксированный список.

Вместо этого :

final _page = [
Home(),
Search(),
Account(),
];

Scaffold(
    body: _page[_currentTab],
    // ...
)

Вы должны сделать что-то вроде этого:

  Widget _getPage(int pos, user User) {
    switch (pos) {
      case 0:
        return Home();
      case 1:
        return Search();
      case 2:
        return Account(user.profile); // Assuming profile is a member of user
      default:
        return Container();
    }
  }

Scaffold(
    body: _getPage(_currentTab, user),
    // ...
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...