[英]UI to GetxController in Flutter
在下面的代码中,我有sample_data
。 但是,我想要这个sample_data
的多个来源,以便每当用户单击questionnaire_data_1
questionnaire 1
时,就会使用下面的 class 访问 questionnaire_data_1。 单击questionnaire_data_2
questionnaire 2
时,将访问 questionnaire_data_2。 现在是 static 并且只访问sample_data
。
我是 state 管理的新手,一直在努力解决这个问题。 我看到了所有其他 stackoverflow 答案,但无法在此代码中实现它。
import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:quiz_app/models/Questions.dart';
import 'package:quiz_app/screens/score/score_screen.dart';
// We use get package for our state management
class QuestionController extends GetxController
with GetSingleTickerProviderStateMixin {
// Lets animated our progress bar
late AnimationController _animationController;
late Animation _animation;
// so that we can access our animation outside
Animation get animation => this._animation;
late PageController _pageController;
PageController get pageController => this._pageController;
List<Question> _questions = sample_data
.map(
(question) => Question(
id: question['id'],
picture: question['picture'],
question: question['question'],
options: question['options'],
answer: question['answer_index']),
)
.toList();
List<Question> get questions => this._questions;
bool _isAnswered = false;
bool get isAnswered => this._isAnswered;
late int _correctAns;
int get correctAns => this._correctAns;
late int _selectedAns;
int get selectedAns => this._selectedAns;
// for more about obs please check documentation
RxInt _questionNumber = 1.obs;
RxInt get questionNumber => this._questionNumber;
int _numOfCorrectAns = 0;
int get numOfCorrectAns => this._numOfCorrectAns;
// called immediately after the widget is allocated memory
@override
void onInit() {
// Our animation duration is 60 s
// so our plan is to fill the progress bar within 60s
_animationController =
AnimationController(duration: Duration(seconds: 60), vsync: this);
_animation = Tween<double>(begin: 0, end: 1).animate(_animationController)
..addListener(() {
// update like setState
update();
});
// start our animation
// Once 60s is completed go to the next qn
_animationController.forward().whenComplete(nextQuestion);
_pageController = PageController();
super.onInit();
}
// // called just before the Controller is deleted from memory
@override
void onClose() {
super.onClose();
_animationController.dispose();
_pageController.dispose();
}
void checkAns(Question question, int selectedIndex) {
// because once user press any option then it will run
_isAnswered = true;
_correctAns = question.answer;
_selectedAns = selectedIndex;
if (_correctAns == _selectedAns) _numOfCorrectAns++;
// It will stop the counter
_animationController.stop();
update();
// Once user select an ans after 3s it will go to the next qn
Future.delayed(Duration(seconds: 3), () {
nextQuestion();
});
}
void nextQuestion() {
if (_questionNumber.value != _questions.length) {
_isAnswered = false;
_pageController.nextPage(
duration: Duration(milliseconds: 250), curve: Curves.ease);
// Reset the counter
_animationController.reset();
// Then start it again
// Once timer is finish go to the next qn
_animationController.forward().whenComplete(nextQuestion);
} else {
// Get package provide us simple way to naviigate another page
Get.to(() => ScoreScreen());
// Get.to(() => QuizScreen());
}
}
void updateTheQnNum(int index) {
_questionNumber.value = index + 1;
}
}
您的问题 Model 可以有一个额外的字段表示类型(问卷 1、问卷 2 等)。 每当使用选择任何问卷时,您都可以过滤所选问卷的结果并将其设置为可观察字段。 如果您在小部件中观察相同的变量,则 UI 将更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.