问题描述
问题
我用以下文件复制了问题。该应用程序有一个菜单。菜单是一个内部带有按钮的modalBottomSheet。该按钮从肘部调用方法,该方法向主屏幕发出状态。在这种情况下,当BlocListener检测到状态时,它将显示一个小吃店。 Bloc在整个应用程序中与BlocProvider共享。
该按钮仅在第一次使用。然后它不再起作用。为什么?我该如何解决?
依赖项
Flutter_bloc: ^6.0.3
equatable: ^0.2.0
Meta: ^1.1.6
main.dart
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',theme: ThemeData(
primarySwatch: Colors.blue,visualDensity: VisualDensity.adaptivePlatformDensity,),home: BlocProvider(
create: (_) => TestCubit(),child: MainScreen(),);
}
}
main_screen.dart
class MainScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: BlocListener(
cubit: context.bloc<TestCubit>(),listener: (context,state) {
if (state is TestStateSnackBar) {
final snackBar = SnackBar(content: Text("I only work once"));
Scaffold.of(context).showSnackBar(snackBar);
}
},child: Center(
child: Flutterlogo(),)),bottomNavigationBar: BottomAppBar(
child: Row(
children: [
IconButton(
icon: Icon(Icons.menu),onpressed: () => showModalBottomSheet(
context: context,builder: (_) => BlocProvider(
create: (_) => context.bloc<TestCubit>(),child: Menu(),)
],);
}
}
menu.dart
class Menu extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListTile(
title: FlatButton(
child: Text("Click to show snack bar"),onpressed: () => context.bloc<TestCubit>().showSnackBar(),);
}
test_cubit.dart
class TestCubit extends Cubit<TestState>{
TestCubit() : super(TestStateInitial());
showSnackBar() => emit(TestStateSnackBar());
}
test_state.dart
@immutable
abstract class TestState extends Equatable {
TestState([List props = const []]) : super(props);
}
class TestStateInitial extends TestState {
@override
String toString() => 'Test Initial';
}
class TestStateSnackBar extends TestState {
@override
String toString() => 'Test SnackBar';
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)