Объект равен нулю во время анимации PageView, работает, когда анимация заканчивается - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать приложение, похожее на блог, используя флаттер.Я создал домашнюю страницу, которая отображает несколько плиток, каждая из которых представляет сообщение, и нажатие на них приведет вас к сообщению в блоге.

Я создал класс виджетов плитки предпросмотра, который принимает в качестве параметров изображение, текст, заголовок и контроллер.Затем они передаются на страницу сообщения по маршруту страницы Купертино.

Так что все вроде как работает, когда я нажимаю на плитки, я перехожу на нужную мне страницу с данными, но когда я прокручиваю плитки в представлении страницы, если плиткипри нажатии на середину прокрутки я получаю сообщение об ошибке

    '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,
    );
  }
}

Я думаю, что данные как-то отсоединяются во время анимации, ноЯ не уверен, как это исправить.

Любая помощь приветствуется.

Спасибо!

1 Ответ

0 голосов
/ 01 апреля 2019

Оказывается, у меня был GestureDetector поверх моего PageView Widget, я удалил его, и все работало отлично.

...