【问题标题】:A value of type 'Set<String?>' can't be assigned to a variable of type 'Map<String, String>''Set<String?>' 类型的值不能分配给'Map<String, String>' 类型的变量
【发布时间】:2021-10-16 22:14:47
【问题描述】:

我正在尝试构建一个 Flutter 测验制作应用程序,但遇到了一些错误。我在实施时遇到的错误如下:

错误 1:必须初始化不可为空的实例字段“_isLoading”。

错误 2:“Set”类型的值无法分配给“Map”类型的变量。

代码如下:

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,
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart flutter-layout flutter-dependencies flutter-web


    【解决方案1】:

    尝试将questionMap 替换为:

      Map<String, String> questionMap = {
        "question" : question,
        "option1" : option1,
        "option2" : option2,
        "option3" : option3,
        "option4" : option4,
      };
    

    您还需要为您的_isLoading 变量指定一个默认值。 将其替换为 bool _isLoading = false; 应该可以。

    【讨论】:

      【解决方案2】:

      将其更改为 : 而不是 =

      Map<String, String> questionMap = {
              "question" : question,
              "option1" : option1,
              "option2" : option2,
              "option3" : option3,
              "option4" : option4,
            };
      

      了解Sets ListsMaps。 列表使用[ ] 但是 map 和 set 都使用花括号 {}。 像列表一样的集合,但具有唯一项,不包含重复项。

      【讨论】:

        猜你喜欢
        • 2021-09-06
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 2021-09-26
        • 2022-10-15
        • 2021-08-20
        • 2023-01-22
        • 2022-12-17
        相关资源
        最近更新 更多