【发布时间】:2020-11-15 18:36:12
【问题描述】:
所以我在 BlocProvider 方面遇到了一些问题。这是我遇到的问题:
编辑:在主页上添加了 DrinkBloc 并更改了 sn-p:
完整代码
@override
Widget build(BuildContext context) {
print("Building entire food list scaffold");
return Scaffold(
appBar: AppBar(title: Text("FoodList")),
//THE BLOCPROVIDER
body: BlocProvider(
//the issue might be that it is DrinkBloc(), but I have 2 separate tables, one after another
create: (BuildContext context) => DrinkBloc(),
child: Column(children: [
Row(
children: [
Text('Drinks'),
Divider(),
IconButton(
icon: Icon(Icons.add),
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => DrinkForm())))
],
),
Expanded(
child: Container(
child: BlocConsumer<DrinkBloc, List<Drink>>(
builder: (context, drinkList) {
return ListView.separated(
itemBuilder: (BuildContext context, int index) {
print("drinkList: $drinkList");
Drink drink = drinkList[index];
return ListTile(
title: Text("${drink.name}",
style: TextStyle(fontSize: 30)),
onTap: () => showDrinkDialog(context, drink, index));
},
itemCount: drinkList.length,
separatorBuilder: (BuildContext context, int index) =>
Divider(color: Colors.black),
);
},
listener: (BuildContext context, drinkList) {},
),
),
),
Row(
children: [
Text('Foods'),
Divider(),
IconButton(
icon: Icon(Icons.add),
onPressed: () => Navigator.push(
context,
MaterialPageRoute(
builder: (BuildContext context) => FoodForm())))
],
),
Expanded(
child: Container(
child: BlocConsumer<FoodBloc, List<Food>>(
builder: (context, foodList) {
return ListView.separated(
itemBuilder: (BuildContext context, int index) {
print("foodList: $foodList");
Food food = foodList[index];
return ListTile(
title:
Text(food.name, style: TextStyle(fontSize: 30)),
subtitle: Text(
"Calories: ${food.calories}\nVegan: ${food.isVegan}",
style: TextStyle(fontSize: 20),
),
onTap: () => showFoodDialog(context, food, index));
},
itemCount: foodList.length,
separatorBuilder: (BuildContext context, int index) =>
Divider(color: Colors.black),
);
},
listener: (BuildContext context, foodList) {},
),
),
),
]),
),
class DrinkBloc extends Bloc<DrinkEvent, List<Drink>> {
@override
List<Drink> get initialState => List<Drink>();
@override
Stream<List<Drink>> mapEventToState(DrinkEvent event) async* {
if (event is SetDrinks) {
yield event.drinkList;
} else if (event is AddDrink) {
List<Drink> newState = List.from(state);
if (event.newDrink != null) {
newState.add(event.newDrink);
}
yield newState;
} else if (event is DeleteDrink) {
List<Drink> newState = List.from(state);
newState.removeAt(event.drinkIndex);
yield newState;
} else if (event is UpdateDrink) {
List<Drink> newState = List.from(state);
newState[event.drinkIndex] = event.newDrink;
yield newState;
}
}
}
片段:
body: BlocProvider(
create: (BuildContext context) => DrinkBloc(),
child: Column(children: [
Row(
我现在遇到的错误基本上是当我单击按钮添加饮料时(“饮料”旁边的按钮)
No ancestor could be found starting from the context that was passed to BlocProvider.of<DrinkBloc>().
The context used was: DrinkForm(state: _DrinkFormState#5d9c5)
BlocProvider.of() called with a context that does not contain a Bloc of type DrinkBloc.
现在的样子(底部可以,但上面的,饮料,不行,可能是因为我把整个东西都包在了 DrinkBloc 里,不知道如何改变它 )
main.dart
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocProvider<FoodBloc>(
create: (context) => FoodBloc(),
child: MaterialApp(
title: 'Sqflite Tutorial',
theme: ThemeData(
primarySwatch: Colors.deepPurple,
),
home: FoodList(),
),
);
}
}
【问题讨论】:
-
也许把代码放在MultiBlocProvider的main中?