#flutter #flutter-web
#флаттер #flutter-web
Вопрос:
Я пытаюсь создать простое приложение для чата с помощью flutter, у меня есть список двух экранных чатов и страница чата, навигация работает, и я передаю данные, но когда я вижу примеры кодов из Интернета, они используют только виджет без состояния, я использую главную страницу в качестве виджета с полным состоянием ивторая страница — виджет без состояния
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' show json;
import 'token.dart';
import 'chat.dart';
void main() {
var x = const AppPage();
runApp(x);
}
class AppPage extends StatefulWidget {
const AppPage({Key? key}) : super(key: key);
static String username = "";
@override
State<StatefulWidget> createState() => _AppState();
}
class _AppState extends State<AppPage> {
var userrName = AppPage.username;
var MessagesList = [];
var profileImg = "http://localhost:5000/images/profiles/avatar.png";
var refreshToken = "";
void user_data_Getter(token) async {
final response = await http.post(
Uri.parse('http://localhost:5000/get/my/data/'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
'Authorization': 'Bearer ${token}',
},
);
var repo = json.decode(response.body);
setState(() {
profileImg = "http://localhost:5000/${repo['user']['avatar']}";
userrName = repo['user']['name'];
MessagesList = repo['messages'];
//print(MessagesList.length);
});
return repo;
}
void fetcher() async {
final response = await http.post(
Uri.parse('http://localhost:5000/api/token/'),
headers: <String, String>{
'Content-Type': 'application/json; charset=UTF-8',
},
body: json.encode(<String, String>{
'email': "mohnas914@gmail.com",
'password': 'admin',
}),
);
var repo = json.decode(response.body);
setState(() {
refreshToken = repo['refresh'];
});
return user_data_Getter(repo['access']);
}
@override
void initState() {
fetcher();
super.initState();
}
void NavFun(BuildContext ctx, datas) {
Navigator.of(ctx).pushReplacement(MaterialPageRoute(builder: (_){
return ChatScreen(datas);
}));
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Color(0xFF0A1D49),
title: Text("Hello, ${userrName}"),
leading: Padding(
padding: EdgeInsets.fromLTRB(4.0, 4.0, 4.0, 4.0),
child: Material(
shape: CircleBorder(),
child: ClipRRect(
borderRadius: BorderRadius.circular(50.0),
child: Image.network(
profileImg,
fit: BoxFit.cover,
)),
),
)),
body: Container(
margin: EdgeInsets.fromLTRB(0.0, 50.0, 0.0, 0.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(top: Radius.circular(10.0)),
color: Color(0xFF1D264B),
),
child: Container(
margin: EdgeInsets.fromLTRB(0.0, 50.0, 0.0, 0.0),
decoration: BoxDecoration(
borderRadius: BorderRadius.vertical(top: Radius.circular(10.0)),
color: Color(0xFF0A1D49),
),
child: Container(
margin: EdgeInsets.fromLTRB(25.0, 25.0, 0.0, 0.0),
child: Center(
child: ListView.builder(
itemCount: (MessagesList.length > 0) ? MessagesList.length : 0,
itemBuilder: (BuildContext context, index) {
return Center(
child: InkWell(
onTap: () => NavFun(context, {
'id': MessagesList[index]['sender']['id'],
'name': MessagesList[index]['sender']['name'],
'img': MessagesList[index]['sender']['pic'],
'token': refreshToken
}),
child: Container(
/*decoration:BoxDecoration(
border: Border(bottom:BorderSide(width: 1.0, color: Colors.white) )
), */
margin: EdgeInsets.fromLTRB(
0.0, (index > 0) ? 25.0 : 0.0, 0.0, 0.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: Row(children: [
CircleAvatar(
backgroundImage: NetworkImage(
'http://localhost:5000${MessagesList[index]['sender']['pic']}'),
),
Container(
margin:
EdgeInsets.fromLTRB(10.0, 0.0, 0.0, 0.0),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
'${MessagesList[index]['sender']['name']}',
style: TextStyle(
color: Colors.white,
fontSize: 20.0)),
Container(
margin: EdgeInsets.fromLTRB(
15.0, 0.0, 0.0, 0.0),
child: Row(children: [
Text(
'${MessagesList[index]['content']}',
style: TextStyle(
color: Colors.white,
fontSize: 20.0)),
]),
)
],
),
),
])),
Container(
margin: EdgeInsets.fromLTRB(0, 0, 10, 0),
child: Text(
'${MessagesList[index]['date']}',
style: TextStyle(
color: Colors.white, fontSize: 20.0),
),
)
])),
));
},
),
),
),
),
),
));
}
}
и вот мой код второй страницы
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:http/http.dart' as http;
import 'dart:convert' show json;
import 'token.dart';
class ChatScreen extends StatelessWidget {
final data;
ChatScreen(this.data);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
backgroundColor: Color(0xFF0A1D49),
title: Text("Hello, ${data['name']}"),
leading: Padding(
padding: EdgeInsets.fromLTRB(4.0, 4.0, 4.0, 4.0),
child: Material(
shape: CircleBorder(),
child: ClipRRect(
borderRadius: BorderRadius.circular(50.0),
child: Image.network(
"http://localhost:5000${data['img']}",
fit: BoxFit.cover,
)),
),
)),
),
);
}
}
я понятия не имею, что происходит с навигацией, так как я только начал изучать flutter 8 часов назад
, я думал, что это из Edge web, поскольку я не использую эмулятор Android * не поддерживает процессор *, но примеры кодов из онлайн работают бесперебойно
Ответ №1:
Похоже, вы используете pushReplacement()
, который заменяет вашу текущую страницу в стеке навигатора. push()
Вместо этого используйте обычную. Кроме того, я думаю, что если вы передадите leading
аргумент в AppBar
, он заменит кнопку «Назад».
Комментарии:
1. я удалил ведущую и использовал нажатие, но все та же проблема