我有一个依赖于用户定义的尺寸的小部件,并且使用上述尺寸来构建ChangeNotifier
,如下所示:
ChangeNotifierProvider(
create: (context) => DimensionsProvider(height, width),
),
我面临的问题是我找不到更新提供程序上这些维度的方法,因为它们来自树上。 例如,如果用户创建这样的小部件:
TheContainer(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
),
然后,当他们旋转设备时,将使用设备高度和宽度的更新值对其进行重建。但是,在TheContainer
小部件内创建的提供程序将不会更新,并且UI将保持其大小。
我需要一种将更改发送给提供者的方法,因为create
方法仅被调用一次。
我试图用
解决ChangeNotifierProxyProvider0(
create: (context) => DimensionsProvider(height, width),
update: (context, provider) => DimensionsProvider(height, width),
);
并且在重建小部件时,它确实会更新提供程序。但是,只要对树下的提供者进行任何更改,都将调用更新,这似乎不正确,因为我不需要在其属性发生更改时就重建整个对象。似乎太浪费了。
这是工作示例:
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: TheContainer(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
),
);
}
}
class TheContainer extends StatelessWidget {
final double height;
final double width;
const TheContainer({
this.height,
this.width,
});
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
create: (context) => DimensionsProvider(height, width),
child: Child(),
);
}
}
class Child extends StatelessWidget {
@override
Widget build(BuildContext context) {
var provider = Provider.of<DimensionsProvider>(context);
return Center(
child: Container(
color: Colors.grey,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(2, (index) {
var maxW = provider.width / 2;
return Container(
height: 80,
width: maxW,
color: index == 0 ? Colors.lightBlue : Colors.lightGreen,
);
}),
),
),
);
}
}
肖像
风景
横向中的预期结果是有色容器填充整个宽度,而不保留其先前的宽度。发生这种情况是因为提供者内部的高度和宽度没有变化。