flutter - 在构建 CatMealsScreen 时引发了以下 NoSuchMethodError
问题描述
我正在尝试使用“OnGenerateRoute”,但出现错误,但是当我直接使用“Routes”时,它运行良好“在构建 CatMealsScreen(脏,依赖项:[_ModalScopeStatus])时抛出了以下 NoSuchMethodError:调用了方法 '[]'空。接收者:空尝试调用:(“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
},
);
}
}
解决方案
我想你需要为switch
你进入的设置做一个声明onGenerateRoute
,所以根据你得到的名字,基本上就是你提供的路线名称,你应该返回你想要导航到的正确屏幕。我还认为您不需要该routes
属性,因为您使用的是onGenerateRoute
.
onGenerateRoute: (settings) {
switch(settings.name){
case CatMealsScreen.routesNames:
return CatMealsScreen();
}
},
推荐阅读
- r - R删除图表区域和轴之间的空白
- android - Android Compose - 仅在列中对齐一个可组合的中心?
- python - Django:媒体 URL 未显示在浏览器上
- macos - 如何在 macOS 上继续接收 SwiftUI 中的关键事件?
- if-statement - 在表格中使用 IF NOT 语句时遇到问题
- r - 识别两个序列之间的突变
- r - 为什么 read.csv() 给我一个来自 .csv 文件而不是数据框的列表?
- c# - 更新类中 Json 属性的名称
- database - AWS 数据存储同步失败:外键约束失败
- wordpress - 在 WooCommerce“我的帐户”订单表的新列中显示产品类别