Флаттерная навигация, обязательный аргумент, отдельный файл маршрутов, как правильно кодировать

#flutter #routes #navigation #switch-statement #arguments

#флаттер #маршруты #навигация #оператор переключения #аргументы

Вопрос:

Итак, я следую руководству и забегаю вперед, но мне бы очень хотелось, чтобы это работало. Я переместил навигацию в ‘routes_constants.dart’ и ‘routes.dart’. Константы, если все в порядке. Маршруты — это то, где я столкнулся с проблемой. Потратив несколько часов на то, чтобы найти и изучить себя, я прошу о помощи.

У меня есть «Экран питания» с «категорией окончательной категории». Проблема заключается в вызове требуемой категории в маршрутах.стрелочный переключатель / регистр / код по умолчанию.

Я разместил код из маршрутов.стрелок ниже. Для тех из вас, кто знает этот «материал», я уверен, что это просто … и скоро, я надеюсь, это будет и для меня. Заранее благодарю вас за любую помощь, которую вы могли бы оказать.

Это сообщения об ошибках / справки. Я пытался и пытался, но не смог победить это! Начало сообщения: (новый) FoodScreen FoodScreen( Set set, { требуемая категория категория, объект? аргумент, }) пакет:myapp/models/food_screen.dart

Именованный параметр ‘category’ является обязательным, но соответствующего аргумента нет. Попробуйте добавить требуемый аргумент. Конец сообщения.

маршруты.выделите код ниже:

 import 'package:flutter/material.dart';
import 'package:myapp/models/category.dart';
import 'package:myapp/models/category_screen.dart';
import 'package:myapp/models/category_item.dart';
import 'package:myapp/models/food_screen.dart';
import 'package:myapp/routes/route_constants.dart';

Route<dynamic> generateRoute(RouteSettings routeSettings) {
  // Getting arguments passed in while calling Navigator
  final args = routeSettings.arguments;

  switch (routeSettings.name) {
    case RouteNames.CategoryScreenRoute:
      return MaterialPageRoute(builder: (context) => CategoryScreen());
    case RouteNames.FoodScreenRoute:
      return MaterialPageRoute(builder: (context) => FoodScreen(??? THIS NEEDS FIX ???));
    default:
      return MaterialPageRoute(builder: (context) => CategoryScreen());
  }
}

 

Экран питания.выделите код ниже:

 import 'package:flutter/material.dart';
import 'package:myapp/models/category.dart';

class FoodScreen extends StatelessWidget {
  final Category category;
  FoodScreen(
    Set set, {
    required this.category,
    Object? argument,
  });
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.black,
        title: Text('${category.content}'),
      ),
      body: Center(
          child: Text(
          'Category: ${category.content}',
          style: TextStyle(fontSize: 24),
          ),
          ),
    );
  }
}

 

Комментарии:

1. Попробуйте прочитать это .

Ответ №1:

Я тоже новичок в Flutter, но я считаю, что если цель состоит в том, чтобы передать category вашему FoodScreen , когда вы вызываете его с помощью Navigator , вы можете сделать следующее:

routes.dart:

 ...
case RouteNames.FoodScreenRoute:
      return MaterialPageRoute(builder: (context) => FoodScreen(
          category: ModalRoute.of(context)!.settings.arguments as Category
      ));
...
 

FoodScreen.dart:

 import 'package:flutter/material.dart';
import 'category.dart';

class FoodScreen extends StatelessWidget {
  final Category category;

  const FoodScreen({
    Key? key,
    required this.category,
  }) : super(key: key); // I believe its best to give widgets keys

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Colors.black,
        title: Text('${category.content}'),
      ),
      body: Center(
        child: Text(
          'Category: ${category.content}',
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

 

Тогда, я думаю, вы сможете вызвать свой FoodScreen using

 Navigator.pushNamed(context, RouteNames.FoodScreenRoute,
                    arguments: category); //where this category has been declared earlier
              };
 

Я не могу проверить это, пока не вернусь домой, но дайте мне знать, если это сработает.

Комментарии:

1. Я действительно ценю помощь. Извините за задержку, не удалось протестировать ваш код до сегодняшнего утра. Все еще возникает проблема, почти такая же проблема, где маршруты. похоже, что регистр / возврат dart никогда не имеет «связи» с аргументом в нижнем регистре «категория».

2. Я перехожу на github, чтобы посмотреть из некоторого кода flutter / routes / argument. Еще раз спасибо… Я буду продолжать пытаться: (