'Set<String?>' 类型的值不能分配给 'Map<String, String>' 类型的变量
A value of type 'Set<String?>' can't be assigned to a variable of type 'Map<String, String>'
我试图构建一个 flutter 测验制作应用程序,但我 运行 遇到了一些错误。我在实施时遇到的错误如下:
错误 1:必须初始化不可为 null 的实例字段“_isLoading”。
错误 2:无法将 'Set<String?>' 类型的值分配给 'Map<String, String>'.
类型的变量
这是代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:quizmaker/services/database.dart';
import 'package:quizmaker/widgets/widgets.dart';
class AddQuestion extends StatefulWidget {
final String? quizId;
AddQuestion(this.quizId);
@override
_AddQuestionState createState() => _AddQuestionState();
}
class _AddQuestionState extends State<AddQuestion> {
final _formKey = GlobalKey<FormState>();
String? question, option1, option2, option3, option4;
bool _isLoading;
DatabaseServices databaseService = new DatabaseServices();
uploadQuizData(){
if(_formKey.currentState!.validate()){
Map<String, String> questionMap = {
"question" = question,
"option1" = option1,
"option2" = option2,
"option3" = option3,
"option4" = option4,
};
databaseService.addQuestionData(questionMap, widget.quizId.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: appBar(context),
backgroundColor: Colors.transparent,
elevation: 0,
iconTheme: IconThemeData(color: Colors.black87),
brightness: Brightness.light,
),
body: Container(
padding: EdgeInsets.symmetric(
horizontal: 24.0,
),
child: _isLoading ? Container(
child: Center(
child: CircularProgressIndicator(),
),
) : Container(
padding: EdgeInsets.symmetric(horizontal: 24.0),
child: Column(
children: [
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Question" : null,
decoration: InputDecoration(
hintText: "Question",
),
onChanged: (value) {
question = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option1" : null,
decoration: InputDecoration(
hintText: "Option 1 (Correct Answer)",
),
onChanged: (value) {
option1 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option2" : null,
decoration: InputDecoration(
hintText: "Option 2",
),
onChanged: (value) {
option2 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option3" : null,
decoration: InputDecoration(
hintText: "Option 3",
),
onChanged: (value) {
option3 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option4" : null,
decoration: InputDecoration(
hintText: "Option 4",
),
onChanged: (value) {
option4 = value;
},
),
Spacer(),
Row(
children: [
blueButton(
context: context,
label: "Submit",
buttonWidth: MediaQuery.of(context).size.width / 2 - 36,
),
SizedBox(
width: 24.0,
),
GestureDetector(
onTap: (){
setState(() {
});
},
child: blueButton(
context: context,
label: "Add Question",
buttonWidth: MediaQuery.of(context).size.width / 2 - 36,
),
),
SizedBox(
height: 60.0,
),
],
),
],
),
),
),
);
}
}
将其更改为 :
而不是 =
Map<String, String> questionMap = {
"question" : question,
"option1" : option1,
"option2" : option2,
"option3" : option3,
"option4" : option4,
};
了解 Sets
Lists
和 Maps
。
列表使用 [ ]
但是map和set都用花括号{}
。
像列表一样的集合,但具有独特的项目,不包含重复项。
尝试将 questionMap
替换为:
Map<String, String> questionMap = {
"question" : question,
"option1" : option1,
"option2" : option2,
"option3" : option3,
"option4" : option4,
};
您还需要为 _isLoading
变量提供默认值。
将其替换为 bool _isLoading = false;
应该可以。
我试图构建一个 flutter 测验制作应用程序,但我 运行 遇到了一些错误。我在实施时遇到的错误如下:
错误 1:必须初始化不可为 null 的实例字段“_isLoading”。
错误 2:无法将 'Set<String?>' 类型的值分配给 'Map<String, String>'.
类型的变量这是代码:
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:quizmaker/services/database.dart';
import 'package:quizmaker/widgets/widgets.dart';
class AddQuestion extends StatefulWidget {
final String? quizId;
AddQuestion(this.quizId);
@override
_AddQuestionState createState() => _AddQuestionState();
}
class _AddQuestionState extends State<AddQuestion> {
final _formKey = GlobalKey<FormState>();
String? question, option1, option2, option3, option4;
bool _isLoading;
DatabaseServices databaseService = new DatabaseServices();
uploadQuizData(){
if(_formKey.currentState!.validate()){
Map<String, String> questionMap = {
"question" = question,
"option1" = option1,
"option2" = option2,
"option3" = option3,
"option4" = option4,
};
databaseService.addQuestionData(questionMap, widget.quizId.toString());
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: appBar(context),
backgroundColor: Colors.transparent,
elevation: 0,
iconTheme: IconThemeData(color: Colors.black87),
brightness: Brightness.light,
),
body: Container(
padding: EdgeInsets.symmetric(
horizontal: 24.0,
),
child: _isLoading ? Container(
child: Center(
child: CircularProgressIndicator(),
),
) : Container(
padding: EdgeInsets.symmetric(horizontal: 24.0),
child: Column(
children: [
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Question" : null,
decoration: InputDecoration(
hintText: "Question",
),
onChanged: (value) {
question = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option1" : null,
decoration: InputDecoration(
hintText: "Option 1 (Correct Answer)",
),
onChanged: (value) {
option1 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option2" : null,
decoration: InputDecoration(
hintText: "Option 2",
),
onChanged: (value) {
option2 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option3" : null,
decoration: InputDecoration(
hintText: "Option 3",
),
onChanged: (value) {
option3 = value;
},
),
SizedBox(
height: 6.0,
),
TextFormField(
validator: (value) => value!.isEmpty ? "Enter Option4" : null,
decoration: InputDecoration(
hintText: "Option 4",
),
onChanged: (value) {
option4 = value;
},
),
Spacer(),
Row(
children: [
blueButton(
context: context,
label: "Submit",
buttonWidth: MediaQuery.of(context).size.width / 2 - 36,
),
SizedBox(
width: 24.0,
),
GestureDetector(
onTap: (){
setState(() {
});
},
child: blueButton(
context: context,
label: "Add Question",
buttonWidth: MediaQuery.of(context).size.width / 2 - 36,
),
),
SizedBox(
height: 60.0,
),
],
),
],
),
),
),
);
}
}
将其更改为 :
而不是 =
Map<String, String> questionMap = {
"question" : question,
"option1" : option1,
"option2" : option2,
"option3" : option3,
"option4" : option4,
};
了解 Sets
Lists
和 Maps
。
列表使用 [ ]
但是map和set都用花括号{}
。
像列表一样的集合,但具有独特的项目,不包含重复项。
尝试将 questionMap
替换为:
Map<String, String> questionMap = {
"question" : question,
"option1" : option1,
"option2" : option2,
"option3" : option3,
"option4" : option4,
};
您还需要为 _isLoading
变量提供默认值。
将其替换为 bool _isLoading = false;
应该可以。