используя RiverPod
Управление состоянием, которое я пытаюсь улучшить, чтобы научиться самому, и как я могу его использовать. Я сделал простой проект и пытаюсь открыть Drawer
, нажав значок в AppBar
, который, к сожалению, находится в другом классе и файле поступая так же, как с RiverPod
образцом кода, мой код работает некорректно, и основной класс не запускается при нажатии на значок
просто я хочу открыть ящик, щелкнув значок на AppBar
главный файл:
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Riverpod Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
final drawerState = StateNotifierProvider<DrawerVisibility>((_)=>DrawerVisibility());
return Consumer(
builder: (context, read, _) {
final state = read(drawerState.state);
print('CLICKED $state');
if(state){
_scaffoldKey.currentState.openDrawer();
}
return Scaffold(
key: _scaffoldKey,
appBar: MyAppBar(),
drawer: Drawer(),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
],
),
),
);
},
);
}
}
AppBar
содержимое файла класса:
class MyAppBar extends StatelessWidget with PreferredSizeWidget {
@override
Widget build(BuildContext context) {
final drawerState = StateNotifierProvider<DrawerVisibility>((_)=>DrawerVisibility());
return AppBar(
automaticallyImplyLeading: false,
title: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
IconButton(icon: Icon(Icons.menu), onPressed: () {
context.read(drawerState).changeDrawerState();
}),
Text('My Sample'),
],
),
);
}
@override
Size get preferredSize => Size.fromHeight(kToolbarHeight);
}
и наконец RiverPod
класс
class DrawerVisibility extends StateNotifier {
DrawerVisibility() : super(false);
void changeDrawerState() => state = true;
}
другая проблема заключается в том, что когда я запускаю приложение в первый раз, я получаю такой результат:
I/flutter (12240): CLICKED false
I/flutter (12240): CLICKED false
без щелчка по значку