嗨,我是 Flutter 的新手,我有一個正在使用的螢屏Navigator.push。我想從我的按鈕頁面路由到聊天訊息頁面。
請看下面的代碼:
問題:我的問題是我需要在IndividualPage()導航中傳遞引數
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',
),
),
),
);
}
}
也請看我的 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;
});
});
}
}
我試圖洗掉,required但它給了我和錯誤。
這是我的聊天模型:
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,
});
}
uj5u.com熱心網友回復:
嘗試實作以下,首先需要指定引數及其型別名稱、圖示等。
class newPage extends StatefulWidget {
final String prevpage;
const newPage({Key? key,required this.prevpage}) : super(key: key);
@override
State<newPage> createState() => _MyAboutPageState(prevpage);
}
在您的 IndividualPage 中嘗試執行此操作
class _MyAboutPageState extends State<newPage> {
String requiredTitle;
_MyAboutPageState(this.requiredTitle);
然后在呼叫頁面時需要傳引數,這里可以傳入contractor方法需要的任意引數,
Navigator.push(context,MaterialPageRoute(builder:(context)=> newPage(requiredTitle: "New Home") ));
要么
routes: <String, WidgetBuilder> {
'/about': (BuildContext context) => newPage(requiredTitle: "Home page”,),
}
也請支持我的答案:)
uj5u.com熱心網友回復:
我邀請您在 這里查看官方檔案
uj5u.com熱心網友回復:
因此,當您使用您的instance比時,請確保required fields在應用程式中的任何位置使用時都使用并作為引數傳遞。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/442445.html
上一篇:如何在飛鏢評論中鏈接到另一個方法
下一篇:雙打圓名單
