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
}
}
)
我有一个问题,我在一个文件 (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
}
}
)