getter'imgUrl'在null上被调用

时间:2020-02-22 16:08:43

标签: firebase flutter google-cloud-firestore

我想从Firestore获取(profile.imgUrl)的值,但出现错误: getter'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 :(得分:0)

创建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),
    // ...
)