- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个按钮,按下它会在数据库中插入一些内容并将用户重定向到另一个页面。我正在尝试实现 FutureBuilder,它应该显示 CircularProgressIndicator
直到一切都完成。
这是我的功能:
Future<bool> insertPhoneNumber(String phoneNumber) async {
String token = await getToken();
if (token.isNotEmpty) {
var body = jsonEncode({'token': token, 'userID': user.getUserID(), 'phoneNumber': phoneNumber});
print(body.toString());
var res = await http.post((baseUrl + "/insertPhoneNumber/" + user.getUserID()),
body: body,
headers: {
"Accept": "application/json",
"content-type": "application/json"
});
if (res.statusCode == 200) {
print("Insert Phone Number is OK");
notifyListeners();
return true;
} else {
print("Insert Phone Number not OK");
notifyListeners();
return false;
}
} else {
print("Insert Phone Number failed due to unexisting token");
}
}
这是一个触发数据库交互的按钮:
RaisedButton(
color: Color.fromRGBO(105, 79, 150, 1),
onPressed: () {
var user = Provider.of<UserRepository>(context);
String completePhoneNumber = _selectedDialogCountry.phoneCode + phoneNumberController.text;
FutureBuilder(
future: user.insertPhoneNumber(completePhoneNumber),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return CircularProgressIndicator(
backgroundColor: Colors.blue);
} else {
return Dashboard();
}
},
);
},
textColor: Colors.white,
child: Text("SAVE"),
)
它更新了数据库,但没有其他事情发生。没有进度指示器,也没有重定向到 Dashboard
。
编辑
这是我的完整构建方法:
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
padding: EdgeInsets.all(8.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
AutoSizeText(
'What is your phone number?',
style: TextStyle(fontSize: 30),
maxLines: 1,
),
Row(
children: <Widget>[
SizedBox(
width: 9.0,
child: Icon(Icons.arrow_downward),
),
SizedBox(width: 8.0),
SizedBox(
width: 120.0,
height: 65.0,
child: Card(
child: ListTile(
onTap: _openCountryPickerDialog,
title: _buildDialogItem(_selectedDialogCountry),
),
)),
Expanded(
child: TextField(
autofocus: true,
keyboardType: TextInputType.number,
decoration:
InputDecoration(border: OutlineInputBorder())),
),
],
),
SizedBox(
width: 100,
child: RaisedButton(
color: Color.fromRGBO(105, 79, 150, 1),
onPressed: () {
print("Test");
},
textColor: Colors.white,
child: Text("SAVE"),
),
)
],
)),
);
}
最佳答案
它不起作用,因为 FutureBuilder
没有附加到 Widget 树。一旦 future 未处于完成状态,它只是创建一个实例 Dashboard
。您不应该在这里使用 FutureBuilder
,而是可以根据一些设置子小部件变量,当 future 完成时,您对该变量调用 setState
来更新状态,这将反过来用新的状态值重建小部件
像这样
var isLoading = false;
void insertNumber(){
var user = Provider.of<UserRepository>(context);
String completePhoneNumber = _selectedDialogCountry.phoneCode + phoneNumberController.text;
setState(() => isLoading=true);
user.insertPhoneNumber(completePhoneNumber).then((result){
setState(() => isLoading=false);
})
}
Widget build(BuildContext context){
return RaisedButton(
color: Color.fromRGBO(105, 79, 150, 1),
onPressed: () {
var user = Provider.of<UserRepository>(context);
String completePhoneNumber = _selectedDialogCountry.phoneCode + phoneNumberController.text;
FutureBuilder(
future: user.insertPhoneNumber(completePhoneNumber),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.connectionState != ConnectionState.done) {
return CircularProgressIndicator(
backgroundColor: Colors.blue);
} else {
return Dashboard();
}
},
);
},
textColor: Colors.white,
child: isLoading? CircularProgressIndicator(): Text("Save"),
);
}
对于您的用例,您将需要两个以上的状态来实现您正在寻找的 UI。示例 DEFAULT
、LOADING
、ERROR
,成功
关于asynchronous - Flutter FutureBuilder 显示进度指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58363902/
假设我从不同的 Url 获取不同的列表所以 Future 函数看起来像这样 Future> getCityDetails(Region selectedRegion) async {} Future>
我正在为用户列表使用 FuturBuilder。我通过 futur: fetchpost() 通过 API 获取用户。在专栏的开头,我实现了一个搜索栏。那么我该如何实现我的搜索栏正在搜索呢? Cont
我必须为屏幕的不同类型的类别构建多个 future builder ,例如:每周交易、全部、新到货等。我现在的代码非常准系统,但在这里。 +主屏幕 import 'package:flutter/ma
当我向下滚动时接近屏幕末尾时,我正在尝试更新我的 Thread 对象列表(以在我继续向下滚动时显示无限的项目列表) 我目前的设置如下: import 'package:flutter/material
用例: FutureBuilder 加载数据并构建小部件* 我按下一个按钮 → 我改变页面/屏幕 我按一个按钮回到 futureBuilder 的屏幕 问题:futureBuilder 是否重新加载数
文章Fetch data from the internet显示了 FutureBuilder 的以下代码片段处理快照。 FutureBuilder( future: post, builde
我的futurebuilder 在屏幕上显示错误几秒钟,然后显示结果这是错误日志: The following NoSuchMethodError was thrown building Future
我正在使用Future构建器从快照中获取数据并将其过滤到另一个创建标记的Future函数中。我通过过滤所有餐厅的位置获得了结果,但是该功能会不断更新,并且数据只会闪烁。 编辑2:JSON数据
当应用程序使用 Future 初始化时我从远程 JSON 获取数据文件。 而不是 return -在 widget当FutureBuilder有数据,我想导航到新屏幕。 我现在使用的方式: @over
我无法让FutureBuilder显示我的计算中的任何数据。我知道计算绝对正确,因为我可以得到正确的答案以打印到控制台中,但似乎无法使其显示在应用程序本身中。 这是代码的代码: Future get
我想显示一个在按下按钮时调用 api 检索到的对象。 我想在按下 floatingActionButton 时更新 FutureBuilder 小部件: class PostScreen ex
在我作为新屏幕的简单代码中,不幸的是 FutureBuilder 工作并从方法中获取数据两次!! 我不确定是什么问题,我该如何避免 class LessonDetail extends Statefu
我想显示一个在按下按钮时调用 api 检索到的对象。 我想在按下 floatingActionButton 时更新 FutureBuilder 小部件: class PostScreen ex
在我作为新屏幕的简单代码中,不幸的是 FutureBuilder 工作并从方法中获取数据两次!! 我不确定是什么问题,我该如何避免 class LessonDetail extends Statefu
我正在尝试查找离我当前位置最近的人。所以我正在从 firestore 中获取所有文档。 我的firestore结构是这样的, 所以我正在获取所有用户并通过计算距离来检查最近的用户,我想将过滤后的数据传
我试图在加载 Future Builder 中的数据时显示循环进度指示器,我尝试了两种方法来添加它,但是它们都不起作用。我怎样才能达到预期的结果? 我的代码 class _MyHomePageStat
当我更改特定 futurebuilder 小部件所依赖的状态时,在异步任务完成之前不会重新绘制小部件。我希望在状态改变后立即重绘小部件。下面是 futurebuilder 的代码: child: ne
我正在从这里获取 json:https://api.myjson.com/bins/1g3xpe ,在我的 flutter 应用程序中。 这是代码(我已经删除了不相关的部分)。问题是,FutureBu
我想知道什么时候应该使用 future builder。例如,如果我想发出一个 http 请求并在 ListView 中显示结果,一旦你打开 View ,我应该使用 future builder 还是
我想测试一个具有 Future 构建器的函数。函数是: Widget loadWidget() { return new FutureBuilder(
我是一名优秀的程序员,十分优秀!