【问题标题】:How can I access elements of map in flutter and display them as buttons?如何在颤动中访问地图元素并将它们显示为按钮?
【发布时间】:2021-09-13 07:55:37
【问题描述】:

我在尝试学习 Flutter 课程时遇到错误。

有效的是它显示问题。 我正在努力寻找答案。它应该从我创建的地图中选择答案。

错误说: 元素类型“Iterable”不能分配给列表类型“Widget”。

这是我的 main.dart:

import 'package:flutter/material.dart';
import 'package:quizapp/answer.dart';
import 'package:quizapp/question.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  var _questionIndex = 0;

  // increases the state of questionIndex by 1
  void _answerQuestion() {
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
    print(_questionIndex);
  }

  var questions = [
    {
      'questionText': 'Question 1',
      'answers': ['Answer 1', 'Answer 2', 'Answer 3', 'Answer 4']
    },
    {
      'questionText': 'Question 2',
      'answers': ['Answer 1', 'Answer 2', 'Answer 3', 'Answer 4']
    },
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Meine erste App'),
        ),
        body: Column(
          children: <Widget>[
            Question(
              questions[_questionIndex]['questionText'].toString(),
            ),
            questions.map((question) {
              return Answer(question);
            })
          ],
        ),
      ),
    );
  }
}

这是我的回答。飞镖:

import 'package:flutter/material.dart';

class Answer extends StatelessWidget {
  final void Function() selectHandler;

  Answer(this.selectHandler);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: MediaQuery.of(context).size.width / 1.2,
      child: ElevatedButton(
        style: ElevatedButton.styleFrom(
          primary: Colors.red,
          onPrimary: Colors.white,
        ),
        child: Text('Antwort 1'),
        onPressed: selectHandler,
      ),
    );
  }
}

感谢您的帮助

所以我更加关注课程。现在在 Flutter 应用程序中出现了错误: “String”类型不是类型转换中“List”类型的子类型

这是我在 main.dart 中的代码

import 'package:flutter/material.dart';
import 'package:notizapp/answer.dart';
import 'package:notizapp/question.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _MyAppState();
  }
}

class _MyAppState extends State<MyApp> {
  var _questionIndex = 0;

  // increases the state of questionIndex by 1
  void _answerQuestion() {
    setState(() {
      _questionIndex = _questionIndex + 1;
    });
    print(_questionIndex);
  }

  var questions = [
    {
      'questionText': 'Question 1',
      'answers': ['Answer 1', 'Answer 2', 'Answer 3', 'Answer 4']
    },
    {
      'questionText': 'Question 2',
      'answers': ['Answer 1', 'Answer 2', 'Answer 3', 'Answer 4']
    },
  ];

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Meine erste App'),
        ),
        body: Column(
          children: <Widget>[
            Question(
              questions[_questionIndex]['questionText'].toString(),
            ),
            ...(questions[_questionIndex]['questionText'] as List<String>)
                .map((answer) {
              return Answer(_answerQuestion, answer);
            }).toList()
          ],
        ),
      ),
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:
        ListView.builder(
          shrinkWrap:true,
          itemCount:questions.length,
          itemBuilder:(c,i){
            return ElevatedButton(
          onPressed:(){
         //todo handle click event
          },
          child: Text(questions[i]['questionText']),
         );
        }
       )
    

    【讨论】:

    • 对不起,我还不明白。我真的是刚开始使用 Flutter 和 Dart 进行编程。
    • 好吧! Flutter 中的 ListView 就像 Android 中的 RecyclerView 一样,它也接受上述参数和其他参数。 Builder 方法按项目填充小部件。 ElevatedButton 是 Button 的小部件类型,类似于 android 中的 CardView,并且具有 onPressed 参数以将 onClick 作为 Android 处理。 text是保存文本类型的数据。
    • 感谢您的解释。错误的原因很简单。我只需要用...(questions[_questionIndex]['answers'] as List&lt;String&gt;) 替换...(questions[_questionIndex]['questionText'] as List&lt;String&gt;) 中的questionText。我认为颤振需要一个字符串列表,但只得到一个字符串。问题本身。感谢您的帮助
    【解决方案2】:

    这是导致您的问题的原因:

    body: Column(
      // The column accepts a list of Widget's.
      children: <Widget>[
        // This is a Widget so it is accepted.
        Question(
          questions[_questionIndex]['questionText'].toString(),
        ),
        // This is not a widget but, the result of a map function.
        questions.map((question) {
          return Answer(question);
        })
      ],
    ),
    
    1. 您应该使用扩展运算符来指示必须添加多个小部件。
    ...questions.map((question) {
      return Answer(question);
    }),
    
    1. 并将可迭代对象转换为列表,因为 Column 小部件只接受小部件列表。
    ...questions.map((question) {
      return Answer(question);
    }).toList(),
    

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2015-01-11
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多