Мне нужно передать значение isBottomBarVisible
из класса A в класс B. Если isBottomBarVisible
истинно, то выровнять его по верхнему центру; в противном случае выровняйте его по центру во Flutter.
class ClassA extends StatelessWidget {
bool isBottomBarVisible = false;
@override
Widget build(BuildContext context) {
// Create an instance of ClassA
return Container(
// Your UI widgets here
);
void _showBottomSheet() {
setState(() {
isBottomSheetVisible = true;
});
showModalBottomSheet(
context: context,
builder: (BuildContext context) {
return Container(
height: 200,
child: Center(
child: Text("This is a bottom sheet"),
),
);
},
).whenComplete(() {
setState(() {
isBottomSheetVisible = false;
});
});
}
}
}
class ClassB extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
// Your UI widgets here
child: AnimatedContainer(
duration: Duration(milliseconds: 500),
alignment: isKeyboardVisible || isBottomSheetVisible // how to get value
? Alignment.topCenter
: Alignment.center,
);
}
}
если оба класса находятся в одном файле, вы можете использовать глобальную переменную для решения вашей проблемы. если нет, используйте конструктор параметров или статическую переменную (MaterialPageRoute)
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Обновите код ClassB, например, добавьте конструкцию
class ClassB extends StatelessWidget {
final bool isBottomSheetVisible;
const ClassB({
super.key,
required this.isBottomSheetVisible,
});
@override
Widget build(BuildContext context) {
return Container(
// Your UI widgets here
child: AnimatedContainer(
duration: Duration(milliseconds: 500),
alignment: isKeyboardVisible || isBottomSheetVisible // how to get value
? Alignment.topCenter
: Alignment.center,
),
);
}
}
Теперь, где бы вы ни вызывали ClassB, например, при переходе от ClassA к ClassB, вам нужно передать значение в ClassB следующим образом: ClassB (isBottomSheetVisible: isBottomSheetVisible).
Чтобы ваше значение isBottomSheetVisible из A перешло в B.
это не работает, потому что мне нужно несколько раз, если при вызове класса в этот раз я должен дать значение
Затем используйте любой метод управления состоянием, сохраните переменную в состоянии и используйте ее во всем проекте.
Единственный способ решить вашу проблему — использовать государственные менеджеры; есть много государственных менеджеров, таких как Bloc, Riverpod, Getx и многие другие...
Я предлагаю вам использовать flutter-bloc(cubit) в качестве менеджера состояний, поскольку он прост и хорошо организован, но если вы хотите использовать простой и более доступный менеджер состояний, выберите getx.
Дайте знать, если у вас появятся вопросы.
Управление государством — ваш друг в такой ситуации. Для достижения этой цели вы можете реализовать любое управление состоянием (Bloc, GetX и т. д.).
Если вас не беспокоят шаблоны проектирования или что-то подобное, вы можете реализовать простейший реактивный виджет в GetX (Obx с Rx).
Пример:
class AppGlobalRxService {
static RxBool isBottomSheetVisible = false.obs;
}
Использование в виджете
Obx(() => Container(
color: AppGlobalRxService.isBottomSheetVisible.value ? Colors.red : Colors.blue,
))
Обновление переменной приведет к перестройке Obx
в пользовательском интерфейсе.
AppGlobalRxService.isBottomSheetVisible.value = true
Примечание. Подумайте о разработке наиболее подходящей структуры файлов и служб для вашего проекта. Код выше — это всего лишь пример.
хороший пример...
но как постоянно обновлять значение глобальной переменной, если она используется.