我在下面粘贴了相关代码,但您也许可以根据我的伪解释来回答。
我使用 FutureBuilder 来构建列表视图。
Future<List<Location>> _listFuture变量中(这是 FutureBuilder 的未来)。 问题是 ListView/Contrainer/ListTile 是由
Future<List<Location>>
Run Code Online (Sandbox Code Playgroud)
。我可以将“tapped”索引传递给我的 ontap 处理程序,但我不相信我可以让我的 _changeBackground() 只需更新所选索引的 backgroundColor 值并调用 setState() 因为您无法直接访问/更新这样的未来(我收到错误ERROR: The operator '[]' isn't defined for the class 'Future<List<Location>>'.)
我不确定我采取了正确的方法。在这种情况下,我想理论上我总是可以将“背景”颜色跟踪分离到一个新的单独列表中(在未来之外),并使用 onTap() 中的对齐索引以这种方式跟踪/引用它。
但是,我不确定这总是有效。将来,我可能需要实际更改将来返回的值/状态。例如,考虑一下我是否希望能够单击列表项并更新“companyName”。在这种情况下,我将直接更改未来存储的值。我想我可以从技术上将新名称发送到服务器并以这种方式完全刷新列表,但这似乎效率低下(如果他们决定“取消”而不保存更改怎么办?)。
任何帮助表示赞赏。谢谢!
这个类实际上保存了列表的相关数据
// Location
class Location {
// members
String locationID;
String …Run Code Online (Sandbox Code Playgroud) 当目标英雄位于 FutureBuilder 中时,我正在绞尽脑汁寻找一种简单的方法来使英雄动画正常工作。我知道这是行不通的,因为英雄图像必须出现在第二个屏幕的第一帧上,而通过 FutureBuilder 从 Firestore 获取数据时显然不能出现这种情况。
这是我的代码:
第一个屏幕:
Hero(
tag: "postImage",
child: Image.network(post.imageurl),
),
Run Code Online (Sandbox Code Playgroud)
第二个屏幕:
FutureBuilder(
future: _futurePost,
builder: (context, AsyncSnapshot snapshot) {
[...]
return Hero(
tag: "postImage",
child: Image.network(snapshot.data.imageurl),
);
}
)
Run Code Online (Sandbox Code Playgroud)
如何实现这一目标?我很惊讶这不是一个常见问题!
谢谢你!
我有一个 DataProvider 和一个 FutureBuilder。
class _UserHeaderState extends State<UserHeader> {
@override
Widget build(BuildContext context) {
var _dataProvider = context.watch<DataProvider>();
var _userProfile = _dataProvider.getUserProfile();
return FutureBuilder<UserProfile>(
future: _userProfile,
builder: (context, snapshot) {
...
Run Code Online (Sandbox Code Playgroud)
我的 DataProvider.photoURL 有配置文件 URL,DataProvider.updatePhotoURL() 会更新它。DataProvider.getUserProfile() 返回 UserProfile 类,UserProfile.name 是用户名等等。
我制作了一个按钮来使用 imagepicker 更新个人资料图像。在 onPressed 中,我包装了 DataProvider.updatePhotoURL(); 和 _userProfile = DataProvider.getUserProfile(); 与 setState.
所需的输出是,当用户从图像选择器中选择照片时,我的 CircleAvatar 应立即显示新选择的照片。
实际输出是 CircleAvatar 显示旧照片,直到我点击热重载或访问另一个页面并返回。
似乎 setState() 和 FutureBuilder 快照的组合搞砸了,但不知道如何修复它。
完整代码如下。(不包括 DataProvider 和 UserProfile 类)
class UserHeader extends StatefulWidget {
@override
_UserHeaderState createState() => _UserHeaderState(); …Run Code Online (Sandbox Code Playgroud) 在我的颤动项目中,当我在模拟器中启动项目时,一切正常,未来的构建器仅触发一次,但是当我进行热重载时,FutureBuilder 会触发两次,这会导致错误,知道如何解决这个问题吗?
Future frameFuture() async {
var future1 = await AuthService.getUserDataFromFirestore();
var future2 = await GeoService.getPosition();
return [future1, future2];
}
@override
void initState() {
user = FirebaseAuth.instance.currentUser!;
super.initState();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: frameFuture(),
builder: (context, snap) {
if (snap.connectionState == ConnectionState.done && snap.hasData) return HomePage();
else return Container(
color: Colors.black,
child: Center(
child: spinKit,
),
);
}
);
}
Run Code Online (Sandbox Code Playgroud) 目前,我正在更新 Flutter 项目的代码库,该项目是在以前的版本上开发的。当我们更新到最新版本的 Dart 和 Flutter 后,就会出现该错误。
这里的代码与我们何时从FutureBuilder.
body: new FutureBuilder<List>(
future: getData(),
builder: (context, snapshot) {
if (snapshot.hasError) print(snapshot.error);
return snapshot.hasData
? new ItemList(
list: snapshot.data, <--- error in here
)
: new Center(
child: new CircularProgressIndicator(),
);
},
),
Run Code Online (Sandbox Code Playgroud)
颤动版本:2.2.2
飞镖版本:2.13.3
请帮我指出我应该为此关注哪一部分。谢谢你!
我在我的一个小部件中使用 FutureBuilder,它需要一个 future。我通过它的构造函数将 future 传递给小部件。问题是,当将 future 传递给小部件时,它会自动执行。由于 FutureBuilder 只接受 Future 而不是 Future Function() 我被迫初始化一个变量,该变量又调用异步函数。但我不知道如何在不执行 Future 的情况下传递它。
这是完整的工作示例:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final icecreamSource = DataService.getIcecream();
final pizzaSource = DataService.getPizza();
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
body: Center(
child: Column(
children: [
MenuButton(label: 'Ice Cream', dataSource: icecreamSource),
MenuButton(label: 'Pizza', dataSource: pizzaSource),
]
),
),
),
);
}
}
class MenuButton extends StatelessWidget {
final String label;
final Future<String> …Run Code Online (Sandbox Code Playgroud) 我正在使用 Flutter FutureBuilder,并发现了一种模式,在 渲染小部件之前检查 和snapshot.hasData : snapshot.data != null
FutureBuilder(
future: future,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData && snapshot.data != null) {
return widgetToBuild;
} else if (snapshot.hasError) {
return Icon(Icons.error_outline);
} else {
return CircularProgressIndicator();
}
}
)
Run Code Online (Sandbox Code Playgroud)
在检查 的源代码后AsyncSnapshot,我注意到被hasData定义为trueif datais not null:
bool get hasData => data != null;
Run Code Online (Sandbox Code Playgroud)
snapshot.hasData鉴于此实现,检查和是否多余snapshot.data != null?还不够snapshot.hasData,因为它本质上检查是否data不是null?
我很好奇是否存在两种检查都可能是必要的情况,或者这是否只是 …
使用Provider和FutureBuilder,我刚刚从数据库中删除了数据,同时它也被删除了,它显示一个红色的屏幕,状态不好,没有元素。添加数据没有问题,不显示这个问题。代码如下
堆栈跟踪
ter (12519): ??? EXCEPTION CAUGHT BY WIDGETS LIBRARY ????????????????????????????????????????????????????????????
I/flutter (12519): The following StateError was thrown building ViewNoteScreen(dirty, dependencies:
I/flutter (12519): [_ModalScopeStatus], state: _ViewNoteScreenState#f589b):
I/flutter (12519): Bad state: No element
I/flutter (12519):
I/flutter (12519): The relevant error-causing widget was:
I/flutter (12519): ViewNoteScreen file:///C:/Users/Admin/Desktop/daily%2010/provider_note/lib/main.dart:21:46
I/flutter (12519):
I/flutter (12519): When the exception was thrown, this was the stack:
I/flutter (12519): #0 ListMixin.firstWhere (dart:collection/list.dart:148:5)
I/flutter (12519): #1 Providers.findById (package:provider_note/helper/provider.dart:14:19)
I/flutter (12519): #2 _ViewNoteScreenState.build (package:provider_note/screens/view_note.dart:21:35)
I/flutter (12519): #3 StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
I/flutter (12519): …Run Code Online (Sandbox Code Playgroud) 我的代码在以下错误中给出了我在此行中从 firebase 访问用户名时遇到的问题
snapshot.data['username']
它给出了上面提到的错误
我知道访问地图数据的唯一方法是这样
FutureBuilder<Object>(
future: FirebaseFirestore.instance
.collection('users')
.doc(userId)
.get(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Text("Loading...");
}
return Text(
snapshot.data['username'],
style: TextStyle(
fontWeight: FontWeight.bold,
),
);
}
),
Run Code Online (Sandbox Code Playgroud) 我只是想选择一个图像并将其显示在我的应用程序中。为此,我使用Flutter Image Picker。我添加了所有依赖项,我可以选择图像,但无法显示它......
这是我尝试过的:
class _AddMemoryPageState extends State<AddMemoryPage> {
final picker = ImagePicker();
late Future<PickedFile?> pickedFile;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.secondary,
body: SafeArea(
child: Column(
children: [
Row(
children: [
Padding(
padding: EdgeInsets.only(
top: 15,
left: 25,
),
child: IconButtonWithExpandedTouchTarget(
onTapped: () {
Navigator.pop(context);
},
svgPath: 'assets/icons/down.svg',
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButtonWithExpandedTouchTarget(
onTapped: () async {
pickedFile = picker
.getImage(
source: ImageSource.camera,
)
.whenComplete(() => {setState(() {})});
},
svgPath: …Run Code Online (Sandbox Code Playgroud) image-gallery dart flutter imagepicker flutter-futurebuilder