标签: flutter-futurebuilder

Flutter - 如何更新用于构建 ListView 的 Future/List 的状态(或值?)(通过 FutureBuilder)

我在下面粘贴了相关代码,但您也许可以根据我的伪解释来回答。

我使用 FutureBuilder 来构建列表视图。

  • 我首先使用 init() 异步 HTTP 调用 API,并将其解析为映射以表示 json 结果的对象列表(位置)。
  • 然后,该位置列表将返回到Future<List<Location>> _listFuture变量中(这是 FutureBuilder 的未来)。
  • 一旦 future“返回”或“完成”,FutureBuilder 就会启动并使用 ListView.builder/Container/ListTile 循环并构建列表。
  • 在某些时候,我需要一个 onTap() 处理程序(在 ListTile 中)来更改所选列表项的背景颜色。
  • 为了支持这一点,我在 Location 类(保存 JSON 响应)中有一个 backgroundColor 成员,对于所有项目,我默认为“#fc7303”(假设所有内容最初始终处于未选中状态)。然后我想将 onTap() 中选择的任何内容的背景更改为“#34bdeb”。
  • 我假设我可以调用 setState() ,这将触发刷新,并且新的背景颜色将在重绘时被注意到/使用。

问题是 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)

listview dart flutter flutter-layout flutter-futurebuilder

5
推荐指数
1
解决办法
2万
查看次数

FutureBuilder 中的 Flutter Hero

当目标英雄位于 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)

如何实现这一目标?我很惊讶这不是一个常见问题!

谢谢你!

flutter flutter-futurebuilder hero

5
推荐指数
0
解决办法
507
查看次数

调用 setState() 时 Flutter FutureBuilder 不更新

我有一个 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)

flutter flutter-futurebuilder

4
推荐指数
1
解决办法
3158
查看次数

Flutter - FutureBuilder 在热重载时触发两次

在我的颤动项目中,当我在模拟器中启动项目时,一切正常,未来的构建器仅触发一次,但是当我进行热重载时,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)

future dart flutter flutter-futurebuilder

4
推荐指数
1
解决办法
1968
查看次数

参数类型“List&lt;dynamic&gt;?” 无法分配给参数类型“List&lt;dynamic&gt;”

目前,我正在更新 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

请帮我指出我应该为此关注哪一部分。谢谢你!

dart flutter flutter-futurebuilder null-safety

3
推荐指数
1
解决办法
2万
查看次数

Flutter - 如何将未来传递给小部件而不执行它?

我在我的一个小部件中使用 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)

dart flutter flutter-futurebuilder

3
推荐指数
1
解决办法
1308
查看次数

在 Flutter 的 FutureBuilder 中检查 `snapshot.hasData` 和 `snapshot.data != null` 是否多余?

我正在使用 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

我很好奇是否存在两种检查都可能是必要的情况,或者这是否只是 …

future dart flutter flutter-futurebuilder

3
推荐指数
1
解决办法
238
查看次数

使用 FutureBuilder 和 Provider 在 Flutter 中没有元素的错误状态

使用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)

flutter flutter-provider flutter-futurebuilder

2
推荐指数
1
解决办法
3972
查看次数

没有为类型“Object”定义运算符“[]”。尝试定义运算符“[]”

我的代码在以下错误中给出了我在此行中从 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)

firebase flutter flutter-futurebuilder

2
推荐指数
3
解决办法
4090
查看次数

颤振显示从图库中选取的图像

我只是想选择一个图像并将其显示在我的应用程序中。为此,我使用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

2
推荐指数
1
解决办法
1万
查看次数