Хочу построить ящик с полотном флаттера. Но в дереве виджетов обнаружен Duplicate GlobalKey. экземпляр перемещен в новое место. Ключ был:
- [LabeledGlobalKey # c9754]
Переродление GlobalKey:
MainScreen (зависимости: [MediaQuery], состояние: _MainScreenState # dc897) GlobalKey может быть указан только для одного виджета за раз в дереве виджетов.
import 'package: flutter / material.dart';
класс MenuController с ChangeNotifier {GlobalKey _scaffoldKey = GlobalKey ();
GlobalKey<ScaffoldState> get scaffoldKey => _scaffoldKey; void controlMenu() { if (!_scaffoldKey.currentState!.isDrawerOpen) { _scaffoldKey.currentState!.openDrawer(); } } // void disposeKey() { // _scaffoldKey.currentState.(); // }
}
class _MainScreenState расширяет состояние {@override void initState () {print ('init CALLED- GAME ---'); super.initState (); }
@override void dispose() { print('DISPOSE CALLED- GAME---'); context.read<MenuController>().scaffoldKey.currentState!.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( key: context.read<MenuController>().scaffoldKey, drawer: SideMenu(), body: SafeArea( child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ // We want this side menu only for large screen if (Responsive.isDesktop(context)) Expanded( // default flex = 1 // and it takes 1/6 part of the screen child: SideMenu(), ), Expanded( // It takes 5/6 part of the screen flex: 5, child: DashboardScreen(), ), ], ), ), ); }}
затем хотите повторно использовать ключ из другого виджета
class ProductsScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
key: context.read<MenuController>().scaffoldKey,
drawer: SideMenu(),
body: SafeArea(
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// We want this side menu only for large screen
if (Responsive.isDesktop(context))
Expanded(
// default flex = 1
// and it takes 1/6 part of the screen
child: SideMenu(),
),
Expanded(
// It takes 5/6 part of the screen
flex: 5,
child: ProductsListScreen(),
),
],
),
),
);
}
}
и получил ошибку
Для навигации внутри виджета SideMenu используйте
Navigator.pushReplacement(
context,
MaterialPageRoute(
builder: (context) => ProductsScreen(),
),
);