使用外部值更新ChangeNotifier

时间:2020-01-01 19:23:16

标签: flutter

我有一个依赖于用户定义的尺寸的小部件,并且使用上述尺寸来构建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,
            );
          }),
        ),
      ),
    );
  }
}

1 肖像

2 风景

横向中的预期结果是有色容器填充整个宽度,而不保留其先前的宽度。发生这种情况是因为提供者内部的高度和宽度没有变化。

0 个答案:

没有答案