Flutter 在其他文件中使用 Future return 值

Flutter use Future return value in other file

我有一个问题,我在一个文件 (Recipe.dart) 中有一个名为 fetchAll() 的方法,我需要这个来 return 我的食谱列表,为此我创建了一个 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() 函数 return 是未来收集的食谱列表?

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

我会先创建一个 RecipiesRepository

在那里你可以有一个方法来获取标题、成分、准备和图像,并且 returns 它们都在一个易于阅读的地方 object。

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


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
    }
  }
)