【问题标题】:Flutter use Future return value in other fileFlutter 在其他文件中使用 Future 返回值
【发布时间】:2020-10-13 17:08:21
【问题描述】:

我有一个问题,我在一个文件(Recipe.dart)中有一个名为 fetchAll() 的方法,我需要它来返回我的食谱列表,为此我创建了一个 Future:

 Future<List<Recipe>> recipes() async {
    // Get a reference to the database.
    final Database db = await database;

    // Query the table for all The Recipes.
    final List<Map<String, dynamic>> title = await db.query('Rezepte');
    final List<Map<String, dynamic>> ingredients = await db.query('Zutaten');
    final List<Map<String, dynamic>> preperation =
        await db.query('Zubereitungen');
    final List<Map<String, dynamic>> imgUrl = await db.query('Images');
    // Convert the List<Map<String, dynamic> into a List<Recipe>.
    return List.generate(title.length, (i) {
      return Recipe(
        id: i,
        name: title[i]['Rezept_Title'],
        ingredients: ingredients[i]['Zutat'],
        preperation: preperation[i]['Zubereitung'],
        imageURL: imgUrl[i]['Image_URl'],
      );
    });
  }

但这是在数据库帮助文件中,否则我无法访问数据库,那么如何连接这些?那么函数 fetchAll() 返回的是未来收集的 Recipes 列表?

【问题讨论】:

    标签: flutter dart future


    【解决方案1】:

    这只是您如何实现它的粗略想法。

    我会先创建一个RecipiesRepository

    在那里,您可以有一个方法来获取标题、成分、准备和图像,并将它们全部返回到一个易于阅读的对象中。

    你可以有一种方法在一个请求中获取所有内容,如下所示:

    
    class RecipiesRepository {
      Future<RecipeModel> getRecipe(){
        return Future.wait([
          _getTitle(),
          _getIngredients(),
          _getPreparation(),
          _getImage(),
        ]).then((results) {
           // return an instance of a RecipeModel here from the results
        });
      }
    }
    
    // RecipeModel
    
    class RecipeModel {
      final List<Map<String, dynamic>> title;
      final List<Map<String, dynamic>> ingredients;
      final List<Map<String, dynamic>> preparations;
      final List<Map<String, dynamic>> imageUrls;
    
      RecipeModel({
        this.title,
        this.ingredients,
        this.preparations,
        this.imageUrls,
      });
    }
    
      
    

    然后您可以使用FutureBuilder 小部件。

    // Create a new instance of RecipesRepository somewhere, giving you `_recipiesRepository`
    
    FutureBuilder(
      future: _recipiesRepository.getRecipe(),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          // snapshot.data will be your RecipeModel
          return List.generate(snapshot.data.title.length, (i) {
            return Recipe(
              id: i,
              name: snapshot.data.title[i]['Rezept_Title'],
              ingredients: snapshot.data.ingredients[i]['Zutat'],
              preperation: snapshot.data.preparations[i]['Zubereitung'],
              imageURL: snapshot.data.imageUrls[i]['Image_URl'],
            );
          });
          
          
        else {
          // Show a spinner of something for a default view
        }
      }
    )
    
    

    【讨论】:

      猜你喜欢
      • 2020-01-05
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多