Hi I'm a newbie in flutter, I have a screen that I'm using Navigator.push
. i'd like to route from my Button Page to the chat message page.
Please see code below:
Issue: My problem is that I need to pass arguments in the IndividualPage()
for navigation
class ButtonScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(backgroundColor: Colors.red, title: const Text("Chat Request")),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => IndividualPage(),),);
},
child: const Text(
'Request Chat',
),
),
),
);
}
}
Please also see my IndividualPage Widget
import 'package:chats_s/ownMessageCard.dart';
import 'package:chats_s/replyCard.dart';
import 'package:chats_s/Model/chat_model.dart';
import 'package:chats_s/Model/message_model.dart';
import 'package:emoji_picker/emoji_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:socket_io_client/socket_io_client.dart' as IO;
class IndividualPage extends StatefulWidget {
const IndividualPage({ Key? key, required this.chatModel, required this.sourchat})
: super(key: key);
final ChatModel chatModel;
final ChatModel sourchat;
@override
_IndividualPageState createState() => _IndividualPageState();
}
class _IndividualPageState extends State<IndividualPage> {
bool show = false;
FocusNode focusNode = FocusNode();
bool sendButton = false;
List<MessageModel> messages = [];
TextEditingController _controller = TextEditingController();
ScrollController _scrollController = ScrollController();
late IO.Socket socket;
@override
void initState() {
super.initState();
// connect();
focusNode.addListener(() {
if (focusNode.hasFocus) {
setState(() {
show = false;
});
}
});
connect();
}
void connect() {
// MessageModel messageModel = MessageModel(sourceId: widget.sourceChat.id.toString(),targetId: );
socket = IO.io("http://10.0.2.2:5000", <String, dynamic>{
"transports": ["websocket"],
"autoConnect": false,
});
socket.connect();
socket.emit("signin", widget.sourchat.id);
socket.onConnect((data) {
print("Connected");
socket.on("message", (msg) {
print(msg);
setMessage("destination", msg["message"]);
_scrollController.animateTo(_scrollController.position.maxScrollExtent,
duration: Duration(milliseconds: 300), curve: Curves.easeOut);
});
});
print(socket.connected);
}
void sendMessage(String message, int sourceId, int targetId) {
setMessage("source", message);
socket.emit("message",
{"message": message, "sourceId": sourceId, "targetId": targetId});
}
void setMessage(String type, String message) {
MessageModel messageModel = MessageModel(
type: type,
message: message,
time: DateTime.now().toString().substring(10, 16));
print(messages);
setState(() {
messages.add(messageModel);
});
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Image.asset(
"assets/whatsapp_Back.png",
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
fit: BoxFit.cover,
),
Scaffold(
backgroundColor: Colors.transparent,
appBar: PreferredSize(
preferredSize: Size.fromHeight(60),
child: AppBar(
leadingWidth: 70,
titleSpacing: 0,
leading: InkWell(
onTap: () {
Navigator.pop(context);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
Icons.arrow_back,
size: 24,
),
CircleAvatar(
child: SvgPicture.asset(
widget.chatModel.isGroup
? "assets/groups.svg"
: "assets/person.svg",
color: Colors.white,
height: 36,
width: 36,
),
radius: 20,
backgroundColor: Colors.blueGrey,
),
],
),
),
title: InkWell(
onTap: () {},
child: Container(
margin: EdgeInsets.all(6),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.chatModel.name,
style: TextStyle(
fontSize: 18.5,
fontWeight: FontWeight.bold,
),
),
Text(
"last seen today at 12:05",
style: TextStyle(
fontSize: 13,
),
)
],
),
),
),
actions: [
IconButton(icon: Icon(Icons.videocam), onPressed: () {}),
IconButton(icon: Icon(Icons.call), onPressed: () {}),
PopupMenuButton<String>(
padding: EdgeInsets.all(0),
onSelected: (value) {
print(value);
},
itemBuilder: (BuildContext contesxt) {
return [
PopupMenuItem(
child: Text("View Contact"),
value: "View Contact",
),
PopupMenuItem(
child: Text("Media, links, and docs"),
value: "Media, links, and docs",
),
PopupMenuItem(
child: Text("Whatsapp Web"),
value: "Whatsapp Web",
),
PopupMenuItem(
child: Text("Search"),
value: "Search",
),
PopupMenuItem(
child: Text("Mute Notification"),
value: "Mute Notification",
),
PopupMenuItem(
child: Text("Wallpaper"),
value: "Wallpaper",
),
];
},
),
],
),
),
body: Container(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: WillPopScope(
child: Column(
children: [
Expanded(
// height: MediaQuery.of(context).size.height - 150,
child: ListView.builder(
shrinkWrap: true,
controller: _scrollController,
itemCount: messages.length 1,
itemBuilder: (context, index) {
if (index == messages.length) {
return Container(
height: 70,
);
}
if (messages[index].type == "source") {
return OwnMessageCard(
message: messages[index].message,
time: messages[index].time,
);
} else {
return ReplyCard(
message: messages[index].message,
time: messages[index].time,
);
}
},
),
),
Align(
alignment: Alignment.bottomCenter,
child: Container(
height: 70,
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Row(
children: [
Container(
width: MediaQuery.of(context).size.width - 60,
child: Card(
margin: EdgeInsets.only(
left: 2, right: 2, bottom: 8),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25),
),
child: TextFormField(
controller: _controller,
focusNode: focusNode,
textAlignVertical: TextAlignVertical.center,
keyboardType: TextInputType.multiline,
maxLines: 5,
minLines: 1,
onChanged: (value) {
if (value.length > 0) {
setState(() {
sendButton = true;
});
} else {
setState(() {
sendButton = false;
});
}
},
decoration: InputDecoration(
border: InputBorder.none,
hintText: "Type a message",
hintStyle: TextStyle(color: Colors.grey),
prefixIcon: IconButton(
icon: Icon(
show
? Icons.keyboard
: Icons.emoji_emotions_outlined,
),
onPressed: () {
if (!show) {
focusNode.unfocus();
focusNode.canRequestFocus = false;
}
setState(() {
show = !show;
});
},
),
suffixIcon: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: Icon(Icons.attach_file),
onPressed: () {
showModalBottomSheet(
backgroundColor:
Colors.transparent,
context: context,
builder: (builder) =>
bottomSheet());
},
),
IconButton(
icon: Icon(Icons.camera_alt),
onPressed: () {
// Navigator.push(
// context,
// MaterialPageRoute(
// builder: (builder) =>
// CameraApp()));
},
),
],
),
contentPadding: EdgeInsets.all(5),
),
),
),
),
Padding(
padding: const EdgeInsets.only(
bottom: 8,
right: 2,
left: 2,
),
child: CircleAvatar(
radius: 25,
backgroundColor: Color(0xFF128C7E),
child: IconButton(
icon: Icon(
sendButton ? Icons.send : Icons.mic,
color: Colors.white,
),
onPressed: () {
if (sendButton) {
_scrollController.animateTo(
_scrollController
.position.maxScrollExtent,
duration:
Duration(milliseconds: 300),
curve: Curves.easeOut);
sendMessage(
_controller.text,
widget.sourchat.id,
widget.chatModel.id);
_controller.clear();
setState(() {
sendButton = false;
});
}
},
),
),
),
],
),
show ? emojiSelect() : Container(),
],
),
),
),
],
),
onWillPop: () {
if (show) {
setState(() {
show = false;
});
} else {
Navigator.pop(context);
}
return Future.value(false);
},
),
),
),
],
);
}
Widget bottomSheet() {
return Container(
height: 278,
width: MediaQuery.of(context).size.width,
child: Card(
margin: const EdgeInsets.all(18.0),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 20),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
iconCreation(
Icons.insert_drive_file, Colors.indigo, "Document"),
SizedBox(
width: 40,
),
iconCreation(Icons.camera_alt, Colors.pink, "Camera"),
SizedBox(
width: 40,
),
iconCreation(Icons.insert_photo, Colors.purple, "Gallery"),
],
),
SizedBox(
height: 30,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
iconCreation(Icons.headset, Colors.orange, "Audio"),
SizedBox(
width: 40,
),
iconCreation(Icons.location_pin, Colors.teal, "Location"),
SizedBox(
width: 40,
),
iconCreation(Icons.person, Colors.blue, "Contact"),
],
),
],
),
),
),
);
}
Widget iconCreation(IconData icons, Color color, String text) {
return InkWell(
onTap: () {},
child: Column(
children: [
CircleAvatar(
radius: 30,
backgroundColor: color,
child: Icon(
icons,
// semanticLabel: "Help",
size: 29,
color: Colors.white,
),
),
SizedBox(
height: 5,
),
Text(
text,
style: TextStyle(
fontSize: 12,
// fontWeight: FontWeight.w100,
),
)
],
),
);
}
Widget emojiSelect() {
return EmojiPicker(
rows: 4,
columns: 7,
onEmojiSelected: (emoji, category) {
print(emoji);
setState(() {
_controller.text = _controller.text emoji.emoji;
});
});
}
}
I tried to remove the required
but it gives me and error.
Here is my chatModel:
String name;
String icon;
bool isGroup;
String time;
String currentMessage;
String status;
bool select = false;
int id;
ChatModel({
required this.name,
required this.icon,
required this.isGroup,
required this.time,
required this.currentMessage,
required this.status,
this.select = false,
required this.id,
});
}
CodePudding user response:
I'm Invinting you to take a loock to the official docs here
CodePudding user response:
try to implement the following, First of all, you need to specify the parameter and its type name, icon, etc.
class newPage extends StatefulWidget {
final String prevpage;
const newPage({Key? key,required this.prevpage}) : super(key: key);
@override
State<newPage> createState() => _MyAboutPageState(prevpage);
}
In your IndividualPage try to do this
class _MyAboutPageState extends State<newPage> {
String requiredTitle;
_MyAboutPageState(this.requiredTitle);
Then when you call the page you need to pass the parameters, here you can send any parameter required by the contractor method,
Navigator.push(context,MaterialPageRoute(builder:(context)=> newPage(requiredTitle: "New Home") ));
OR
routes: <String, WidgetBuilder> {
'/about': (BuildContext context) => newPage(requiredTitle: "Home page”,),
}
Also please upvote my Answer :)
CodePudding user response:
So when you are using your your instance
than make sure that all the required instances
are used and passed as an argument while using anywhere in application.