我有一个变量late Future<QuestionModel> question;
和一个获取QuestionModel的函数
fetchQuestion(){
// Question model is initialised here
}
它正在生成中用于显示UI
FutureBuilder(
future: question,
builder: (context, snapshot) {
if (snapshot.data == null) {
return LoadingWidget(
height: 200,
width: 200,
);
}
if (snapshot.hasError) {
return Text("Something went wrong");
}
QuestionModel question = snapshot.data as QuestionModel;
return Container(),
);
}
),
它运行良好。
在UI本身,我有一个按钮,它发送数据到后端,并从Firestore获取新的QuestionModel。它也很好用。
要求:点击按钮后显示加载屏幕,避免重新点击,直到获取新的QuestionModel,但我不想为此创建单独的isLoading
变量。
我只是想重置questionModel,它之前被初始化为questionModel = null
,并通过使用futurebuilder本身来显示加载屏幕,因为我已经将LoadingWidget连接到了我的FutureBuilder。但这是不可能的,因为Future不能为null,错误如下
A value of type 'Null' can't be assigned to a variable of type 'Future<QuestionModel>'.
编辑2:换句话说,我想取消初始化future,以触发Future构建器显示正在加载Widget。
3条答案
按热度按时间omtl5h9j1#
尝试此处的演示以了解更多信息
https://dartpad.dev/?id=3dadbc210baaf70d405b75e5389c7ba8
您可以使用
setState
来重建FutureBuilder
。但是,当您将
FutureBuilder
定义为local state variable
时,FutureBuilder
将不会执行future
方法解决方案:
helper.dart
中然后在
FutureBuilder
小部件中,使用ConnectionState.waiting
的条件,每次你调用
setState
,apiCall
就会被执行ps:如果你使用
snapshot.hasData
,它将是true
即使apiCall
还没有完成.更好地了解连接状态。sg3maiej2#
将声明更改为:
late Future<QuestionModel>? question;
将代码更改为:
nhjlsmyf3#
你可以试试这个:(由于FutureBuilder每次调用setState时都会进行重建,因此我们不应该使用它。
1.将QuestionModel声明为可空变量
1.创建函数来获取问题,例如:
1.在initState内部调用它
1.您可以创建如下所示的小部件
1.最后但并非最不重要的是,您可以通过调用_loadData()来获取按钮单击时的新问题,屏幕将显示加载,直到问题被成功获取。