Я пытаюсь создать демонстрационное приложение для чата с Flutter. После моего основного экрана я использую Navigator.push, чтобы перейти к экрану деталей.
Скриншот проблемы:
метод сборки 1-го экрана:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Chat Thread App"),
actions: <Widget>[
IconButton(
icon: Icon(Icons.settings),
onPressed: () {
Navigator.pushNamed(context, '/settings');
},
)
],
),
body: isLoading
? Center(
child: CircularProgressIndicator(),
)
: new ChatThreadListCard(messageThreads: _messageThreadLists, user: _user,),
);
}
код метода Navigator.push:
Navigator.push(context, MaterialPageRoute(
builder: (context) => ChatDetailsScreen(threadModel: new ThreadModel(
user.id,
user.fullName,
user.pic,
"otherId",
"otherName",
"otherPic",
post.threadId
)
),
),);
метод сборки 2-го экрана, где возникает проблема:
return Scaffold(
appBar: AppBar(
title: Text("Chat demo"),
),
body: WillPopScope(
child: isLoading
? Center(
child: CircularProgressIndicator(),
)
: Stack(
alignment: AlignmentDirectional.bottomCenter,
children: <Widget>[
SizedBox(
width: 300,
height: 300,
),
Column(
children: <Widget>[
buildChat(),
buildInput(),
],
)
],
),
onWillPop: onBackPress,
),
);
не могли бы вы уточнить? я не должен использовать леса на втором экране? если я не использую скаффолд на втором экране, то кнопка «Назад» не появляется.
Можете ли вы ввести ошибку, я не вижу изображения, я думаю, что imgur здесь запрещен
проблема в том, что когда я не использую Scaffold на втором экране и не перехожу к нему, кнопка «Назад» не отображается. и, когда я использую скаффолд и панель приложений на втором экране, на втором экране есть две панели приложений.
@GünterZöchbauer





Я предполагаю, что что-то не так работает с тем местом, где вы настраиваете Material App?
приложение.дротик:
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: HomePage());
}
}
домашняя_страница и вторая_страница
import 'package:flutter/material.dart';
class HomePage extends StatefulWidget {
@override
State createState() => HomePageState();
}
class HomePageState extends State<HomePage> with TickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('First Page'),
),
body: Container(
child: Center(child: RaisedButton(child: Text('Forward'), onPressed: () async {
await Navigator.push(context, MaterialPageRoute(builder: (context) => SecondPage()));
},)),
));
}
}
class SecondPage extends StatefulWidget {
@override
State createState() => SecondPageState();
}
class SecondPageState extends State<SecondPage> with TickerProviderStateMixin {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Container(
child: Center(child: RaisedButton(child: Text('Backward'), onPressed: () {
Navigator.of(context).pop();
},)),
));
}
}
Что производит:
main.dart code: void main() { runApp(MaterialApp( title: 'Chat apps Demo', initialRoute: '/', route: { '/': (context) => SplashScreen(), '/login': ( context) => LoginScreen(), '/home' : (context) => ChatThreadScreen(), '/settings' : (context) => SettingScreen(), })); } после этого: if (isLoggedin){ Navigator.pushReplacementNamed(context, "/home"); }else{ Navigator.pushReplacementNamed(context, "/login"); }
извините, не знаю, как добавить туда новую строку. вот ссылка pastebin ссылка на сайт
проблема заключается в том, что я создавал виджет MaterialApp в теле скаффолда. поэтому при вызове метода onTap новый экран заменялся областью приложения MaterialApp. не заменили весь экран.
хитрость заключалась в том, чтобы удалить return new MaterialApp().
всем спасибо.
Не вкладывать
Scaffold