Следующая ошибка NoSuchMethodError была выбрана при построении CatMealsScreen. - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь использовать «OnGenerateRoute», но появляется ошибка, но когда я использую «Маршруты» напрямую, это работает хорошо »Следующая ошибка NoSuchMethodError была выброшена при построении CatMealsScreen (грязный, зависимости: [_ModalScopeStatus]): метод '[]' был вызван на null. Получатель: null Попытка вызвать :( "tittle") "

import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:resturant/widgets/meal.dart';
import '../DUMMY_CATEGORIES.dart';
import 'package:resturant/widgets/mealItem.dart';

class CatMealsScreen extends StatefulWidget {
static const routesNames = '/CatMealScreen';
final List<Meal> _availableMeals2;

CatMealsScreen(this._availableMeals2);

@override
_CatMealsScreenState createState() => _CatMealsScreenState();
}

class _CatMealsScreenState extends State<CatMealsScreen> {
String catTittle;

List<Meal> displayMeals;
bool _loadInitData = false;

@override
void didChangeDependencies() {
 // TODO: implement didChangeDependencies
 if (_loadInitData == false) {
  final routeArg =
      ModalRoute.of(context).settings.arguments as Map<String, String>;
  catTittle = routeArg['tittle'];
  final catId = routeArg['id'];
  displayMeals = widget._availableMeals2.where((meal) {
    return meal.categories.contains(catId);
  }).toList();
  _loadInitData = true;
 }
super.didChangeDependencies();
}

@override
Widget build(BuildContext context) {
return Scaffold(
    appBar: AppBar(
      title: Text(catTittle),
    ),
    body: ListView.builder(
        itemBuilder: (ctx, index) {
          return MealItem(
            id: displayMeals[index].id,
            title: displayMeals[index].title,
            imageUrl: displayMeals[index].imageUrl,
            duration: displayMeals[index].duration,
            affordability: displayMeals[index].affordability,
            complexity: displayMeals[index].complexity,
          );
        },
        itemCount: displayMeals.length));
     }
     }

основной файл

import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:resturant/DUMMY_CATEGORIES.dart';
import 'package:resturant/screenWidget/mealDetails.dart';
import 'package:resturant/screenWidget/settings.dart';
import 'package:resturant/screenWidget/tabsScreen.dart';
import 'package:resturant/widgets/meal.dart';
import 'screenWidget/catMealsScreen.dart';
import 'screenWidget/catScreen.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
Map<String, bool> _filters = {
'gluten': false,
'lactose': false,
'vegan': false,
'vegetarian': false,
};
List<Meal> _availableMeals = DUMMY_MEALS;
List<Meal> _favouriteMeals = [];

void _setFilter(Map<String, bool> filterData) {
setState(() {
  _filters =
      filterData; // the new value of filters will equal to the value of filterData
  // that when the setstate() work it will work on the new value of filter
  _availableMeals = DUMMY_MEALS.where((meal) {
    if (_filters['gluten'] == true && !meal.isGlutenFree) {
      return false;
    }
    if (_filters['lactose'] == true && !meal.isLactoseFree) {
      return false;
    }
    if (_filters['vegan'] == true && !meal.isVegan) {
      return false;
    }
    if (_filters['vegetarian'] == true && !meal.isVegetarian) {
      return false;
    }
    return true;
  }).toList();
});
}

void _toggleMeals(String mealId) {
final existingMeal =
    _favouriteMeals.indexWhere((element) => element.id == mealId);
 if (existingMeal >= 0) {
  setState(() {
    _favouriteMeals.removeAt(existingMeal);
  });
} else {
  setState(() {
    _favouriteMeals.add(
      DUMMY_MEALS.firstWhere((element) => element.id == mealId),
    );
  });
}
}

bool isFavMeal(String id) {
 return _favouriteMeals.any((element) => element.id == id);
}

 @override
 Widget build(BuildContext context) {
  return Platform.isIOS
    ? CupertinoApp()
    : MaterialApp(
        title: 'DeliMeals',
        theme: ThemeData(
          primarySwatch: Colors.pink,
          accentColor: Colors.amber,
          canvasColor: Color.fromRGBO(255, 255, 204, 1),
          fontFamily: 'Raleway',
          textTheme: ThemeData.light().textTheme.copyWith(
                body1: TextStyle(
                  color: Color.fromRGBO(20, 51, 51, 1),
                ),
                body2: TextStyle(
                  color: Color.fromRGBO(20, 51, 51, 1),
                ),
                title: TextStyle(
                    fontFamily: 'RobotoCondensed',
                    fontSize: 18,
                    fontWeight: FontWeight.bold),
              ),
        ),
        home: TabsScreen(_favouriteMeals),
        routes: {
          CatMealsScreen.routesNames: (ctx) =>
              CatMealsScreen(_availableMeals),
          MealDetail.routeNmaes: (ctx) => MealDetail(_toggleMeals , isFavMeal),
          Settings.routeNames: (ctx) => Settings(_setFilter, _filters),
        },
        onGenerateRoute: (settings) {
          print(settings.arguments);
          return MaterialPageRoute(builder: (ctx) => CatMealsScreen());
        },
        onUnknownRoute: (setting) {
          return MaterialPageRoute(builder: (ctx) => CatMealsScreen());

          // both produce the same error
        },
      );
     }
     }

1 Ответ

0 голосов
/ 19 июня 2020

Думаю, вам нужно сделать оператор switch для настроек, которые вы получаете в onGenerateRoute, поэтому в зависимости от имени, которое вы получаете, которое в основном является именем маршрута, которое вы предоставляете, вы должны вернуть правильный экран, по которому вы хотите перемещаться к. Я также думаю, что вам не нужно свойство routes, поскольку вы используете onGenerateRoute.

 onGenerateRoute: (settings) {
      switch(settings.name){
      case CatMealsScreen.routesNames:
        return CatMealsScreen();

      }
    },
...