【发布时间】:2021-09-10 19:46:09
【问题描述】:
我关注video tutorial 制作了一个显示不同鸡尾酒以及如何制作它们的应用程序,但最后我遇到了一个我不知道如何解决的错误。我查找了错误,但我无法找出导致它的原因。 这是我得到的错误;
> Unhandled Exception: type 'Null' is not a subtype of type 'String'
我在 searchpage.dart 上收到此错误,代码如下:
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:http/http.dart';
import 'package:mimir_cocktails/constants.dart';
import 'package:mimir_cocktails/pages/cocktail_page.dart';
import 'package:mimir_cocktails/services/cocktail_manager.dart';
import 'package:mimir_cocktails/services/ingredients.dart';
class SearchPage extends StatefulWidget {
// SearchPage({Key? key}) : super(key: key);
@override
_SearchPageState createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
String cocktailName = 'margarita';
var _deviceWidth;
var _deviceHeight;
@override
Widget build(BuildContext context) {
_deviceWidth = MediaQuery.of(context).size.width;
_deviceHeight = MediaQuery.of(context).size.height;
return Scaffold(
body: SafeArea(
child: Center(
child: Padding(
padding: EdgeInsets.all(12.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// The Logo
Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(100),
),
height: _deviceHeight * 0.25,
width: _deviceWidth * 0.5,
child: Image(image: AssetImage('assets/cocktails_logo.png')),
),
// Title
Text(
'Mimir Cocktails',
style: GoogleFonts.raleway(fontSize: 35),
),
SizedBox(height: 32),
// Textfield
TextField(
onChanged: (value) {
value = cocktailName;
},
decoration: InputDecoration(
contentPadding: EdgeInsets.all(15),
hintText: 'Search for a Cocktail',
border: kBorderStyle,
focusedBorder: kFocusedBorderStyle,
),
),
SizedBox(height: 20),
// SearchBTN
ElevatedButton(
onPressed: () async {
// ignore: unnecessary_null_comparison
if (cocktailName == null) return;
cocktailName.toLowerCase().replaceAll(' ', '_');
CocktailManager cm = CocktailManager();
var network = await get(Uri.parse(kMainURL + cocktailName));
var jsonData = jsonDecode(network.body);
cm.name = jsonData['drinks'][0]['strDrink'];
cm.category = jsonData['drinks'][0]['strCategory'];
cm.alcoholic = jsonData['drinks'][0]['strAlcoholic'];
cm.glassType = jsonData['drinks'][0]['strGlass'];
cm.imgURL = jsonData['drinks'][0]['strDrinkThumb'];
cm.instructions = jsonData['drinks'][0]['strInstructions'];
String strIngredientName, strIngredientMesure;
List<Ingredient> ingredientList = [];
for (var ings = 1; ings < 16; ings++) {
strIngredientName = 'strIngredientName' + ings.toString();
strIngredientMesure =
'strIngredientMesure' + ings.toString();
ingredientList.add(
Ingredient(
name: jsonData['drinks'][0][strIngredientName],
mesure: jsonData['drinks'][0][strIngredientMesure],
),
);
ingredientList.removeWhere((element) =>
// ignore: unnecessary_null_comparison
element.name == null && element.mesure == null);
ingredientList.forEach((element) {
// ignore: unnecessary_null_comparison
if (element.mesure == null) {
element.mesure = 'as you wish';
}
});
}
cm.ingredients = ingredientList;
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return CocktailPage(
name: cm.name,
category: cm.category,
alcoholic: cm.alcoholic,
glassType: cm.glassType,
imgURL: cm.imgURL,
instructions: cm.instructions,
ingredients: cm.ingredients);
}),
);
},
child: Text(
'Search',
style: GoogleFonts.ubuntu(fontSize: 25),
),
style: ElevatedButton.styleFrom(
primary: kAccentColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25)),
minimumSize: Size(_deviceWidth * 0.65, 48),
),
),
SizedBox(height: 15),
// RandomBTN
ElevatedButton(
onPressed: () async {
CocktailManager cm = CocktailManager();
var network = await get(Uri.parse(kMainURL + cocktailName));
var jsonData = jsonDecode(network.body);
cm.name = jsonData['drinks'][0]['strDrink'];
cm.category = jsonData['drinks'][0]['strCategory'];
cm.alcoholic = jsonData['drinks'][0]['strAlcoholic'];
cm.glassType = jsonData['drinks'][0]['strGlass'];
cm.imgURL = jsonData['drinks'][0]['strDrinkThumb'];
cm.instructions = jsonData['drinks'][0]['strInstructions'];
// ignore: unused_local_variable
String? strIngredientName, strIngredientMesure;
List<Ingredient> ingredientList = [];
for (var ings = 1; ings < 16; ings++) {
strIngredientName = 'strIngredientName' + ings.toString();
strIngredientMesure =
'strIngredientMesure' + ings.toString();
ingredientList.add(
Ingredient(
name: jsonData['drinks'][0][strIngredientName],
mesure: jsonData['drinks'][0][strIngredientMesure],
),
);
ingredientList.removeWhere((element) =>
// ignore: unnecessary_null_comparison
element.name == null && element.mesure == null);
ingredientList.forEach((element) {
// ignore: unnecessary_null_comparison
if (element.mesure == null) {
element.mesure = 'as you wish';
}
});
}
cm.ingredients = ingredientList;
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return CocktailPage(
name: cm.name,
category: cm.category,
alcoholic: cm.alcoholic,
glassType: cm.glassType,
imgURL: cm.imgURL,
instructions: cm.instructions,
ingredients: cm.ingredients);
}),
);
},
child: Text(
'Feeling Locky',
style: GoogleFonts.ubuntu(fontSize: 25),
),
style: ElevatedButton.styleFrom(
primary: kAccentColor,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(25)),
minimumSize: Size(_deviceWidth * 0.65, 48),
),
),
],
),
),
),
),
);
}
}
这就是我得到错误的地方
ingredientList.add(
Ingredient(
name: jsonData['drinks'][0][strIngredientName],
mesure: jsonData['drinks'][0][strIngredientMesure],
),
这是我的 coctail_manager.dart
import 'package:mimir_cocktails/services/ingredients.dart';
class CocktailManager {
String? name;
String? category;
String? alcoholic;
String? glassType;
String? imgURL;
String? instructions;
List<Ingredient>? ingredients;
CocktailManager({
this.name,
this.category,
this.alcoholic,
this.glassType,
this.imgURL,
this.instructions,
this.ingredients,
});
}
请你看看,让我知道问题是什么 如果你想检查整个应用程序,这是Github repository。
【问题讨论】:
标签: json string flutter null subtype