Я пытаюсь создать приложение, похожее на блог, используя флаттер.Я создал домашнюю страницу, которая отображает несколько плиток, каждая из которых представляет сообщение, и нажатие на них приведет вас к сообщению в блоге.
Я создал класс виджетов плитки предпросмотра, который принимает в качестве параметров изображение, текст, заголовок и контроллер.Затем они передаются на страницу сообщения по маршруту страницы Купертино.
Так что все вроде как работает, когда я нажимаю на плитки, я перехожу на нужную мне страницу с данными, но когда я прокручиваю плитки в представлении страницы, если плиткипри нажатии на середину прокрутки я получаю сообщение об ошибке
'package:flutter/src/painting/image_resolution.dart': Failed assertion:
line 134 pos 15: 'assetName != null': is not true.
Вот что у меня есть:
class HomeScreen extends StatefulWidget {
@override
HomeScreenState createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen>{
final PageController _controller = PageController(viewportFraction: 0.80, initialPage: 0);
@override
Widget build(BuildContext context) {
Widget horizontalList1 = GestureDetector(
onTap: () {
Navigator.of(context).push(ArticlePageRoute());
},
child: FadeUp(
child: Container(
child: PageView(
scrollDirection: Axis.horizontal,
controller:_controller,
children: <Widget>[
PreviewTile(image:"lib/images/tile.jpg",title: "Title 1 - Lorem Ipsum", text: "Lorem Ipsum is simply dummy text of the printing and typesetting industry.",controller: _controller),
...
],
))),
);
Widget home = Container(
child: MediaQuery.removePadding(
context: context,
child: ListView(
children: <Widget>[
header,
horizontalList1,
],
),
));
return Scaffold(
resizeToAvoidBottomPadding: false,
body: home,
);
}
}
class ArticlePageRoute extends CupertinoPageRoute {
ArticlePageRoute() : super(builder: (BuildContext context) => ArticlePage());
// OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return ArticlePage();
}
}
class PreviewTile extends StatefulWidget {
final String image;
final String text;
final String title;
final PageController controller;
PreviewTile(
{@required this.image,
@required this.title,
@required this.text,
@required this.controller});
@override
_PreviewTileState createState() => _PreviewTileState();
}
class _PreviewTileState extends State<PreviewTile> {
@override
Widget build(BuildContext context) {
Widget tile = GestureDetector(
onTap: () {
Navigator.of(context).push(ArticlePageRoute(widget.title,widget.text,widget.image));
},
child: Container(
child: Column(
children: <Widget>[
Container(
child: ClipRRect(
child: ParallaxImage(
controller: widget.controller,
image: AssetImage(widget.image),
),
),
),
Container(
child: Column(
children: <Widget>[
Material(
child: Text(
widget.title,
)),
Material(
child: Text(
widget.text,
),
)
],
)),
],
),
),
);
return tile;
}
}
class ArticlePageRoute extends CupertinoPageRoute {
final String titleText;
final String bodyText;
final String imageURL;
ArticlePageRoute(this.titleText, this.bodyText, this.imageURL) : super(builder: (BuildContext context) => ArticlePage(image:imageURL,title:titleText,body:bodyText));
// OPTIONAL IF YOU WISH TO HAVE SOME EXTRA ANIMATION WHILE ROUTING
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return ArticlePage(image:imageURL,title:titleText,body:bodyText);
}
}
class ArticlePage extends StatefulWidget {
final String image;
final String title;
final String body;
ArticlePage({
this.image,
this.title,
this.body});
@override
ArticlePageState createState() => ArticlePageState();
}
class ArticlePageState extends State<ArticlePage> {
final ScrollController _controller = ScrollController();
@override
Widget build(BuildContext context) {
Widget header = GestureDetector(
onTap: () {
Navigator.pop(context);
},
...
child: ParallaxImage(
controller: _controller,
image: AssetImage(widget.image),
...
child: Container(
...
child: Text(
widget.title,
...
),
)),
),
),
);
...
Widget home = Container(
child: MediaQuery.removePadding(
context: context,
child: ListView(
controller: _controller,
children: <Widget>[header, body],
),
));
return Scaffold(
resizeToAvoidBottomPadding: false,
body: home,
);
}
}
Я думаю, что данные как-то отсоединяются во время анимации, ноЯ не уверен, как это исправить.
Любая помощь приветствуется.
Спасибо!