在Flutter App中使用GetX时,如何响应屏幕方向的更改?OrientationBuilder
不工作,即使 Package 在Obs内并使用Get.context.isLandscape
等。
在一个测试应用程序中,我尝试了以下方法,但没有效果:
class Home extends GetView<StoreController> {
Home({Key? key}) : super(key: key) {
Get.put(StoreController());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Orientation Test"),
// Does not work
leading: OrientationBuilder(
builder: (ctx, or) {
return Get.context?.isLandscape ?? false
? const Icon(Icons.menu)
: const Icon(Icons.add);
},
),
// Does not work
leading: OrientationBuilder(
builder: (ctx, orientation) {
return orientation == Orientation.landscape
? const Icon(Icons.menu)
: const Icon(Icons.add);
},
),
// Does not work (error: improper use of Obs())
leading: Obx(() {
//controller.counter.value++;
return OrientationBuilder(
builder: (ctx, orientation) {
return orientation == Orientation.landscape
? const Icon(Icons.menu)
: const Icon(Icons.add);
},
);
}),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text('You have pushed the button this many times:'),
Obx(() => Text('${controller.counter.value}', style: Theme.of(context).textTheme.headline4)),
],
),
),
floatingActionButton: FloatingActionButton(onPressed: controller.incCounter, tooltip: 'Increment', child: const Icon(Icons.add)),
);
}
}
简单控制器:
class StoreController extends GetxController {
final counter = 0.obs;
void incCounter() {
counter.value++;
}
}
2条答案
按热度按时间pbwdgjma1#
你可以通过以下方式做到这一点:
oknrviil2#
您可以使用
GetResponsiveView
代替GetView
。这将给予您可以访问不同的布局扩展,例如screen
。然后你有不同的选项来做你想做的事情。一个是使用
mobile()
,phone()
,tablet()
和desktop()
覆盖,但你也可以使用builder()
方法来做。