Здравствуйте, я новичок в трепетании и создал приложение для создания форм. Я использую Cloud Firestore в качестве базы данных. Проблема, с которой я сталкиваюсь - это попытка отрисовки определенных c виджетов на основе условия. Я построил форму и настроил данные объекта следующим образом: у каждого проекта есть список объектов вопросов, содержащих информацию о вопросе. Я хочу перебрать объекты вопроса и проверить тип вопроса, а затем на основе этого типа вопроса отобразить определенный виджет (например, множественный выбор, загрузка изображений, короткий ответ и т. Д. c). В идеале это будет отображаться как один вопрос на странице с помощью следующей кнопки. Я хотел бы остаться на одной странице и просто вызывать / отображать другие виджеты / функции, когда пользователь нажимает следующую.
Проблема в том, что я не могу заставить виджеты отображаться и / или перенаправить с помощью условного оператора. Прямо сейчас я установил простой для каждого l oop с оператором switch, вложенным внутрь, однако, так как итерация продолжается, пока это не последний объект, который страницы никогда не визуализируют. Моя цель - добавить кнопку при нажатии, чтобы продолжить итерацию.
У меня есть страница проекта представления, которая устанавливает объект GetProject и затем вызывает необходимые функции класса для получения данных из хранилища.
class Questions{
final String question;
final String number;
final String type;
Questions({this.question, this.number, this.type});
List<String> answers = new List();
}
class GetProject {
final String docID;
final String title;
GetProject({this.docID, this.title});
List<Questions> questions = new List();
//....Class Functions below not relevant
}
Вот то, что у меня есть для страницы проекта представления
import 'package:flutter/material.dart';
import '../../models/project.dart';
import '../../Services/getproject.dart';
import 'textquestion.dart';
import 'multiplechoicequestion.dart';
import 'UserLocationInfo.dart';
import 'shortanswerquestion.dart';
class ViewProject extends StatefulWidget {
final String docIDref;
final String title;
ViewProject({this.docIDref, this.title});
@override
_ViewProjectState createState() => _ViewProjectState();
}
class _ViewProjectState extends State<ViewProject> {
@override
Widget build(BuildContext context) {
GetProject project = new GetProject(docID: widget.docIDref, title: widget.title);
project.getdataFromProject();
project.questions.forEach((e){
var type = e.type;
switch(type){
case 'TextInputItem':
return new TextQuestionWidget(question: e);
case 'MultipleChoice':
return new MultQuestionWidget(question: e);
case 'ShortAnswer':
return new ShortAnswerQuestion(question: e);
case 'UserLocation':
return new UserLocationInfo(question: e);
}
return null;
});
//project.printproj();
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Container(
child: Card(
child: ListTile(
title: Text('Print Values to debug console'),
subtitle: Text(''),
trailing: Icon(Icons.arrow_forward_ios),
onTap: () {
project.printproj();
}
),
),
),
);
}
}
Вот пример того, как будет выглядеть вызываемый виджет
import '../../Services/getproject.dart';
class UserLocationInfo extends StatefulWidget {
final Questions question;
UserLocationInfo({this.question});
@override
_UserLocationInfoState createState() => _UserLocationInfoState();
}
class _UserLocationInfoState extends State<UserLocationInfo> {
@override
Widget build(BuildContext context) {
return Container(
);
}
}