List (飞镖/颤振)从无序列表中拉出一个项目,而不重新生成列表

List (飞镖/颤振)从无序列表中拉出一个项目,而不重新生成列表,list,random,flutter,dart,shuffle,List,Random,Flutter,Dart,Shuffle,我是个新手,这是我自己的第一个应用程序项目,我一件事也做不到 我想洗牌一个列表,以便它显示的问题在一个随机顺序,但一次一个,我不希望有任何重复。当我尝试这样做时,我每次都会重新生成一个新的无序列表,有没有办法只生成一次,然后从中一次提取一个问题,而不让它重复问题 我有一个名为“\u questionBankEasy”的列表,其中有15个项目,我想从中提取。 我用这个是因为这似乎是我能找到的最接近的答案: //内部问题\u bank.dart 导入'dart:math'作为数学; //无序列表 列

我是个新手,这是我自己的第一个应用程序项目,我一件事也做不到

我想洗牌一个列表,以便它显示的问题在一个随机顺序,但一次一个,我不希望有任何重复。当我尝试这样做时,我每次都会重新生成一个新的无序列表,有没有办法只生成一次,然后从中一次提取一个问题,而不让它重复问题

我有一个名为“\u questionBankEasy”的列表,其中有15个项目,我想从中提取。 我用这个是因为这似乎是我能找到的最接近的答案:

//内部问题\u bank.dart
导入'dart:math'作为数学;
//无序列表
列表洗牌(简单列表){
var random=math.random();
对于(var i=1.length-1;i>0;i--){
var n=随机的nextInt(i+1);
var-temp=简单[i];
问题银行easy[i]=问题银行easy[n];
问题[n]=温度;
}
回归容易;
}
int _questionNumber=0;
//生成一个无序列表
字符串getQuestionTextEasy(){
返回洗牌(_questionBankEasy)[_questionNumber];
}
//下一个问题
void nextQuestion(){
if(selectedDifficulty==难度.easy&&
_问题编号<\u questionBankEasy.length-1){
_问题编号++;
打印(问题编号);
}
//内部问题屏幕\u text.dart
类QuestionScreenText扩展了无状态小部件{
问题屏幕文本();
@凌驾
小部件构建(构建上下文){
if(selectedDifficulty==难度.简单){
返回文本(
QuizGenerator().getQuestionTextEasy(),
风格:可质疑,
textAlign:textAlign.center,
);
}
//内部问题
类QuestionScreen扩展StatefulWidget{
@凌驾
_QuestionScreenState createState()=>\u QuestionScreenState();
}
类_QuestionScreenState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
背景颜色:kDarkGreyRed,
正文:专栏(
mainAxisAlignment:mainAxisAlignment.spaceBetween,
儿童:[
填充物(
填充:常数边集全部(25.0),
子项:QuestionScreenText(),
),
图标按钮(
填充:边缘集。全部(0),
图标:图标(Icons.close),
iconSize:100.0,
颜色:KwhiteColor,
disabledColor:Colors.transparent,
highlightColor:Colors.transparent,
splashColor:KPinkColor,
已按下:(){
设置状态(){
QuizGenerator().nextQuestion();
});
},
),
]
);
}
}

我原以为这会起作用,但事实并非如此,结果是代码从列表中提取了一项,但当我按下调用nextQuestion()的“下一步”按钮时,有时会重复出现一个问题。这可以解决吗?

这是一个非常基本的示例,可以在模拟器中运行。 在代码中添加了注释,请阅读

导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
//一些数据点的问题列表
列出问题=[
“问题1”,
“问题2”,
“问题3”,
“问题4”,
“问题5”,
“问题6”,
“问题7”,
“问题8”,
“问题9”,
“问题10”,
“问题11”,
“问题12”,
“问题13”,
];
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
主页:第页(),
);
}
}
类页面扩展StatefulWidget{
@凌驾
State createState()=>\u PageState();
}
类_PageState使用SingleTickerProviderStateMixin扩展状态{
//用于保存问题列表和当前问题的变量
列出问题;
字符串问题;
@凌驾
void initState(){
//使用初始问题列表的副本初始化页面问题
_页面问题=问题;
super.initState();
}
void_shuffleQuestions(){
//初始化空变量
字符串问题;
//检查列表中是否还有一些问题
if(_pageQuestions.isNotEmpty){
//洗牌
_pageQuestions.shuffle();
//从列表中选出最后一个问题
问题=_pageQuestions.removeLast();
}
设置状态(){
//调用set state以更新视图
_当前问题=问题;
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:容器(
填充:边缘组。对称(水平:20.0),
子:ListView(
收缩膜:对,
主要:错误,
儿童:[
if(_pageQuestions.isNotEmpty&&u currentQuestion==null)
文本(“按下“下一个问题”按钮”),
如果(_pageQuestions.isEmpty)文本('不再有问题'),
if(_pageQuestions.isNotEmpty&&u currentQuestion!=null)
正文(
“${u currentQuestion}(问题左:${u pageQuestions.length}”),
升起的按钮(
onPressed:_shuffleQuestions,
儿童:文本(“下一个问题”),
)
],
),
),
),
);
}
}

您能用显示问题的page类来完成示例吗?最好在有状态小部件的initState()方法内的单独变量中初始化问题,然后将其洗牌并调用removeLast()之类的函数,它将弹出并返回列表末尾的一项。感谢您的回答,我现在已经给出了完整的示例。我尝试过执行removeLast(),但无法使其正常工作,因此可能缺少一些内容。您能举个例子吗?您的意思是在initState()中创建列表和无序化,然后用removeLast()调用它当按钮处于预启动状态时