I am a beginner flutter developer. While writing the code, I encountered the following problem. You can see the code attached below, I've never used the null check operator, but the IDE is pointing out that that's the problem. I have no idea if this is a structural problem or a grammatical problem. Can you help me which part is wrong? Thank you so much.......
'''dart import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:faker/faker.dart';
import 'package:jiffy/jiffy.dart';
import 'package:soyou/screen/profile_page.dart';
import '../helper.dart';
import '../models/message_data.dart';
import '../widgets/avatar.dart';
import '../widgets/icon_button.dart';
import 'package:soyou/theme.dart';
import '../models/story_data.dart';
import 'chat_screen.dart';
import 'package:soyou/app.dart';
class MessagePage extends StatelessWidget{
const MessagePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final brightness = Theme.of(context).brightness;
return Scaffold(
appBar: AppBar(
iconTheme: Theme.of(context).iconTheme,
backgroundColor: Colors.transparent,
elevation: 0,
title: Text('Messages', style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
color: (brightness == Brightness.light) ? Appcolors.textDark : Appcolors.textLight),),
leading: Center(child: IconBackground(
icon: Icons.search,
onTap: (){
},),),
actions: [
Padding(padding: EdgeInsets.only(right: 24),
child: Avatar.small(
url: context.currentUserImage,
onTap: (){
Navigator.of(context).push(ProfilePage.route);
},),)
],
),
body: CustomScrollView(
slivers: [
SliverToBoxAdapter(child: _Stories(),),
SliverList(delegate: SliverChildBuilderDelegate((BuildContext context, int index){
final Faker faker = Faker();
final date = Helpers.randomDate();
return _MessageTile(messageData: MessageData(
sendName: faker.person.name(),
message: faker.lorem.sentence(),
messageDate: date,
dateMessage: Jiffy(date).fromNow(),
profilePicture: Helpers.randomPictureUrl()
));
}),),
],
),
);
}
}
class _MessageTile extends StatelessWidget{
const _MessageTile({Key? key, required this.messageData}) : super(key: key);
final MessageData messageData;
@override
Widget build(BuildContext context){
return InkWell(
onTap: (){
Navigator.of(context).push(ChatScreen.route(messageData));
},
child: Row(children: [
Padding(padding: EdgeInsets.all(10), child: Avatar.medium(url: messageData.profilePicture),),
Expanded(child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(messageData.sendName,
overflow: TextOverflow.ellipsis,
style: TextStyle(
letterSpacing: 0.2,
wordSpacing: 1.5,
fontWeight: FontWeight.w900
),),
SizedBox(height: 20, child: Text(messageData.message,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 12,
color: Appcolors.textFaded
),),),
],),),
Padding(padding: EdgeInsets.only(right: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
SizedBox(height: 4,),
Text(messageData.dateMessage.toUpperCase(),
style: TextStyle(
fontSize: 11,
letterSpacing: -0.2,
fontWeight: FontWeight.w600,
color: Appcolors.textFaded
),),
SizedBox(height: 8,),
Container(
width: 18,
height: 18,
decoration: BoxDecoration(
color: Appcolors.secondary,
shape: BoxShape.circle
),
child: Center(
child: Text('1',
style: TextStyle(color: Appcolors.textLight, fontSize: 10),),
),
)
],
),)
],),
);
}
}
class _Stories extends StatelessWidget{
const _Stories({Key? key}) : super(key: key);
@override
Widget build(BuildContext context){
return Card(
margin: EdgeInsets.only(top: 15),
elevation: 0,
child: SizedBox(
height: 134,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(left: 16, top: 8, bottom: 16),
child: Text('스토리', style: TextStyle(fontSize: 15, fontWeight: FontWeight.w900, color: Appcolors.textFaded),),
),
Expanded(
child: ListView.builder(scrollDirection: Axis.horizontal, itemBuilder: (BuildContext context, int index){
final faker = Faker();
return Padding(
padding: EdgeInsets.all(8),
child: SizedBox(
width: 60,
child: _StoryCard(storyData:
StoryData(
name: faker.person.name(),
url: Helpers.randomPictureUrl())),
),
);
}),),
],),),
);
}
}
class _StoryCard extends StatelessWidget{
const _StoryCard({Key? key, required this.storyData}) : super(key: key);
final StoryData storyData;
@override
Widget build(BuildContext context){
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Avatar.medium(url: storyData.url),
Expanded(
child: Padding(
padding: EdgeInsets.only(top: 16),
child: Text(
storyData.name,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontSize: 11, letterSpacing: 0.3, fontWeight: FontWeight.bold),
),
),
),
],
);
}
}
'''
The following _CastError was thrown building MessagePage(dirty, dependencies: [_InheritedTheme, _LocalizationsScope-[GlobalKey#116dc]]):
Null check operator used on a null value
The relevant error-causing widget was:
MessagePage MessagePage:file:///C:/Users/kmseo/AndroidStudioProjects/SoYou/lib/screen/home_screen.dart:20:5
When the exception was thrown, this was the stack:
#0 StreamChatContext.currentUserImage (package:soyou/app.dart:10:46)
#1 MessagePage.build (package:soyou/screen/message_page.dart:40:34)
#2 StatelessElement.build (package:flutter/src/widgets/framework.dart:4827:28)
#3 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4754:15)
#4 Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#5 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4735:5)
#6 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4729:5)
#7 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3790:14)
#8 Element.updateChild (package:flutter/src/widgets/framework.dart:3524:20)
#9 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4780:16)
#10 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4928:11)
#11 Element.rebuild (package:flutter/src/widgets/framework.dart:4477:5)
#12 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2659:19)
#13 WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:882:21)
#14 RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:363:5)
#15 SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1144:15)
#16 SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1081:9)
#17 SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:995:5)
#21 _invoke (dart:ui/hooks.dart:151:10)
#22 PlatformDispatcher._drawFrame (dart:ui/platform_dispatcher.dart:308:5)
#23 _drawFrame (dart:ui/hooks.dart:115:31)
CodePudding user response:
I believe that this variable does not exist (or is not set correctly) and thus is NULL:
context.currentUserImage
.
This triggers an internal NULL-check when trying to set it as the URL in line 40, because the URL is not allowed to be NULL:
url: context.currentUserImage
.