Флаттер: Почему я получаю сообщение об ошибке «Создатели маршрутов никогда не должны возвращать ноль»? - PullRequest
3 голосов
/ 07 марта 2019

Я новичок в трепетании, ниже указан мой код

homepage.dart

import 'package:flutter/material.dart';

import './product_page.dart';

class Homepage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("Choco Factory"),
      ),
      body: HomepageUI(),
    );
  }
}

class HomepageUI extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _HomepageUIState();
  }
}

class _HomepageUIState extends State<HomepageUI> {
  List<Map<String, String>> productsMap = [];

  _HomepageUIState() {
    productsMap
        .add({"title": "Cappuccino", "imageUrl": "assets/cappuccino.jpg"});
    productsMap.add(
        {"title": "Chocolate Cake", "imageUrl": "assets/chocolate_cake.jpg"});
    productsMap
        .add({"title": "Chocolates", "imageUrl": "assets/chocolates.jpg"});
    productsMap.add(
        {"title": "Hot Chocolate", "imageUrl": "assets/hot_chocolate.jpg"});
    productsMap.add({"title": "Naougat", "imageUrl": "assets/nougat.jpg"});
    productsMap.add(
        {"title": "White Chocolate", "imageUrl": "assets/white_chocolate.jpg"});
  }

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Column(
      children: <Widget>[
        Text("Select Your Choco!"),
        Expanded(
            child: ListView.builder(
          itemBuilder: _listBuilder,
          itemCount: productsMap.length,
        )

            //child: Image.asset("assets/chocolates.jpg"),
            )
      ],
    );
  }

  Widget _listBuilder(BuildContext context, int index) {
    return Card(
      child: Column(
        children: <Widget>[
          Image.asset(productsMap[index]["imageUrl"]),
          Text(productsMap[index]["title"]),
          RaisedButton(
            child: Text("Details"),
            color: Colors.green,
            onPressed: () {
              Navigator.push(context,
                  MaterialPageRoute(builder: (BuildContext context) {
                ProductPage(productsMap[index]["title"],
                    productsMap[index]["imageUrl"]);
              }));
            },
          )
        ],
      ),
    );
  }
}

product_page.dart

import 'package:flutter/material.dart';

class ProductPage extends StatelessWidget {
  final String  title, imageUrl;

  ProductPage(this.title,this.imageUrl);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return Scaffold(
      appBar: AppBar(
        title: Text("Choco Factory"),
      ),
      body: ProductPageUI(title, imageUrl),
    );
  }
}

class ProductPageUI extends StatefulWidget {

  String title, imageUrl;

  ProductPageUI(this.title, this.imageUrl);

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return _ProductPageUIState();
  }
}

class _ProductPageUIState extends State<ProductPageUI> {
  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    return _productPageUIBuilder(widget.title, widget.imageUrl);
  }

  Widget _productPageUIBuilder(String title, String imageUrl) {
    return Column(
      children: <Widget>[
        Text(title),
        Image.asset(imageUrl),
        Text(
            "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean semper sodales nisi, ac ornare nisl ullamcorper vel. Aliquam nibh libero, consequat in arcu molestie, congue scelerisque elit. Integer eu ex in tellus iaculis egestas. Aliquam a molestie ante. Etiam eget magna id neque suscipit sollicitudin. Phasellus dolor erat, sagittis ut felis quis, faucibus finibus est. Aenean nunc justo, venenatis nec urna a, vehicula lacinia odio. Ut molestie velit vitae augue pulvinar dignissim. Integer tempus nisi dignissim nisl rutrum venenatis at in leo."),
      ],
    );
  }
}

Когда я нажимаю на кнопку, я получаю следующую ошибку.Если ошибки нет, я должен перейти на другую страницу «ProductPage».

I/flutter (31115): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (31115): The following assertion was thrown building Builder(dirty):
I/flutter (31115): The builder for route "null" returned null.
I/flutter (31115): Route builders must never return null.

В чем здесь проблема?

Ответы [ 4 ]

3 голосов
/ 07 марта 2019

Как говорится в сообщении об ошибке, вы ничего не возвращаете в своем построителе маршрутов.Вы пропустили ответное заявление

Navigator.push(context,
                  MaterialPageRoute(builder: (BuildContext context) {
                return ProductPage(productsMap[index]["title"], // you miss return here!
                    productsMap[index]["imageUrl"]);
              }));
0 голосов
/ 29 мая 2019
  Navigator.push(context,
                  MaterialPageRoute(builder: (BuildContext context) {
                PageOne();
              }));

Вместо того, чтобы просто создавать экземпляр страницы, которую нужно нажать в методе компоновщика, добавьте ее в качестве возвращаемого параметра

Navigator.push(context,
                  MaterialPageRoute(builder: (BuildContext context) {
              return  PageOne();
              }));
0 голосов
/ 07 марта 2019

Вы забыли вернуть виджет в функцию-строитель

                  MaterialPageRoute(builder: (BuildContext context) {
                return ProductPage(productsMap[index]["title"],
                    productsMap[index]["imageUrl"]);
              }));

или, если вы предпочитаете использовать лямбда-функцию, синтаксис будет:

                MaterialPageRoute(
                  builder: (BuildContext context) => ProductPage(
                      productsMap[index]["title"],
                      productsMap[index]["imageUrl"]),
                ),
0 голосов
/ 07 марта 2019

перемещение productsMap в initState () функция не в конструкторе

  initState() {
    super.initState();
    productsMap
        .add({"title": "Cappuccino", "imageUrl": "assets/cappuccino.jpg"});
    productsMap.add(
        {"title": "Chocolate Cake", "imageUrl": "assets/chocolate_cake.jpg"});
    productsMap
        .add({"title": "Chocolates", "imageUrl": "assets/chocolates.jpg"});
    productsMap.add(
        {"title": "Hot Chocolate", "imageUrl": "assets/hot_chocolate.jpg"});
    productsMap.add({"title": "Naougat", "imageUrl": "assets/nougat.jpg"});
    productsMap.add(
        {"title": "White Chocolate", "imageUrl": "assets/white_chocolate.jpg"});
  }

также ваша Navigator.push

Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => ProductPage(productsMap[index]["title"],
                productsMap[index]["imageUrl"])),
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...