我正在創建一個關于 Flutter 和 Firestore 中購物清單的應用程式。我現在正在嘗試使用 bloc 模式,當我按下一個按鈕時,我想導航到另一個螢屏以創建一個新串列,如果我按下另一個按鈕,我想在該螢屏上呼叫 bloc 和業務邏輯來創建一個新的購物清單,然后回傳螢屏,顯示用戶的所有購物清單。
這是我呼叫 MultiBlocProvider 的主要部分。現在我有 blocProviders 一個用于身份驗證,另一個用于購物清單。
Widget build(BuildContext context) {
FirebaseFunctions functions = FirebaseFunctions.instance;
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
debugShowCheckedModeBanner: false,
home: MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => AuthBloc(FirebaseAuthProvider())),
BlocProvider(
create: (context) => ShoppingBloc(FirebaseCloudStorage()),
)],
child: const HomePage(),
),
routes: {
createOrUpdateNoteRoute: (context) => const CreateUpdateNoteView(),
createOrUpdateShoppingCartListRoute: (context) => const CreateUpdateShoppingCartListView(),
},
);
這是當我按下時我想導航到不同螢屏的按鈕:
IconButton(
onPressed: () {
Navigator.push(context,
MaterialPageRoute(
builder: (context) =>
BlocProvider<ShoppingBloc>.value(
value: context.read<ShoppingBloc>(),
child: const CreateUpdateShoppingCartListView(),
)
),
);
},
icon: const Icon(Icons.add),
),
這是我稱之為集團的觀點:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('New shopping cart list'),
actions: [
IconButton(
onPressed: () {
final text = _textController.text;
final ownerUserId = currentUser.id;
context.read<ShoppingBloc>()
.add(ShoppingCreateNewShoppingCartEvent(ownerUserId, 'creating a new list'));
},
icon: const Icon(Icons.add),
),
],
),
body: Column(children: [
TextField(
controller: _textController,
keyboardType: TextInputType.multiline,
maxLines: null,
textInputAction: TextInputAction.go,
decoration: const InputDecoration(
hintText: 'Start typing you shopping cart name...',
),
),
],
),
);
這是集團:
class ShoppingBloc extends Bloc<ShoppingEvent, ShoppingState> {
ShoppingBloc(FirebaseCloudStorage provider) : super(ShoppingInitial()) {
on<ShoppingCreateNewShoppingCartEvent>((event, emit) async{
final ownerUserId = event.ownerUserId;
final name = event.name;
try {
provider.createNewShoppingCartList(ownerUserId: ownerUserId, name: name);
emit(const StateCreateShoppingCart());
} catch (e){
print('There was an error in createNewShoppingCartEvent in bloc');
}
});
}
}
事件:
class ShoppingCreateNewShoppingCartEvent extends ShoppingEvent{
final String ownerUserId;
final String name;
const ShoppingCreateNewShoppingCartEvent(this.ownerUserId, this.name);
}
這就是狀態:
class StateCreateShoppingCart extends ShoppingState {
const StateCreateShoppingCart();
}
我收到錯誤訊息Could not find the correct Provider<ShoppingBloc> above this Builder Widget。我嘗試了多種解決方案,但沒有一個奏效。我認為 中的提供者與 中shoppingCartView的提供者不同,CreateUpdateShoppingCartListView所以我想在導航器中傳遞這個提供者還是有更好的解決方案?
提前致謝。
uj5u.com熱心網友回復:
您已經在 MaterialApp 中提供了 ShoppingBloc,但也嘗試在此處提供新的 bloc:
BlocProvider<ShoppingBloc>.value(
value: context.read<ShoppingBloc>(),
child: const CreateUpdateShoppingCartListView(),
)
...那很糟...
試試這個.. 正確添加命名路由并從MaterialApp中移除MultiBlocProvider
Widget build(BuildContext context) {
FirebaseFunctions functions = FirebaseFunctions.instance;
return MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => AuthBloc(FirebaseAuthProvider())),
BlocProvider(
create: (context) => ShoppingBloc(FirebaseCloudStorage()),
),
],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(primarySwatch: Colors.blue),
debugShowCheckedModeBanner: false,
home: const HomePage(),
routes: {
"/createOrUpdateNote": (context) => const CreateUpdateNoteView(),
"/shopingCartListRoute": (context) => const CreateUpdateShoppingCartListView(),
},
),
);
然后你可以像這樣導航
IconButton(
onPressed: () {
Navigator.pushNamed(context, '/shopingCartListRoute');
},
icon: const Icon(Icons.add),
)
然后使用您提供的塊(您提供的示例似乎還可以)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('New shopping cart list'),
actions: [
IconButton(
onPressed: () {
final text = _textController.text;
final ownerUserId = currentUser.id;
context.read<ShoppingBloc>()
.add(ShoppingCreateNewShoppingCartEvent(ownerUserId, 'creating a new list'));
},
icon: const Icon(Icons.add),
),
],
),
body: Column(children: [
TextField(
controller: _textController,
keyboardType: TextInputType.multiline,
maxLines: null,
textInputAction: TextInputAction.go,
decoration: const InputDecoration(
hintText: 'Start typing you shopping cart name...',
),
),
],
),
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/522165.html
標籤:扑颤振块
上一篇:包版本不兼容
