gpt4 book ai didi

flutter - 在 flutter 中使用提供者时如何避免不必要的重建?

转载 作者:IT王子 更新时间:2023-10-29 06:37:59 25 4
gpt4 key购买 nike

我正在使用 provider 在我的应用程序中,但我面临着不必要的构建。

例子

class AllWidget extends StatelessWidget{

@override
Widget build(BuildContext context){
print('state build called');
return ChangeNotifierProvider(
builder: (_) => MyCounter(),
child: Column(children: <Widget>[
MyCounterText(),
MyIncreaseButton(),
MyDecreaseButton(),
],
),
);
}
}

class MyCounterText extends StatelessWidget{

@override
Widget build(BuildContext context) {
final myCounter = Provider.of<MyCounter>(context, listen: false);
print('MyCounterText');
return Text(myCounter.num.toString());

}
}

class MyIncreaseButton extends StatelessWidget{
@override
Widget build(BuildContext context) {
final myCounter = Provider.of<MyCounter>(context, listen: false);
print('MyIncreaseButton');
return RaisedButton(
child: Text('Increase +'),
onPressed: ()=> myCounter.increment(),
);

}
}


class MyDecreaseButton extends StatelessWidget{
@override
Widget build(BuildContext context) {
final myCounter = Provider.of<MyCounter>(context, listen: false);
print('MyDecreaseButton');
return RaisedButton(
child: Text('Decrease -'),
onPressed: ()=> myCounter.decrement(),
);

}
}

现在,如果我点击 MyIncreaseButton 小部件,为了增加值,MyDecreaseButton 小部件也会构建,即使我没有点击它也是如此。

反之亦然,如果我单击 MyDecreaseButton 小部件以减小值,即使我没有单击它,MyIncreaseButton 小部件也会构建。

我的期望是:

单击 MyIncreaseButton 小部件时,不应构建 MyDecreaseButton 小部件。

最佳答案

有多种解决方案:

  • 使用context.read 或将listen: false 传递给Provider.of:
RaisedButton(
onPressed: () {
context.read<MyModel>().increment();
// alternatively, do:
Provider.of<MyModel>(context, listen: false).increment();
},
child: Child(),
);
  • 使用context.select:
Widget build(context) {
final increment = context.select((MyModel m) => m.increment);

return RaisedButton(
onPressed: increment,
child: Child(),
);
}
  • 使用选择器:
Widget build(context) {
return Selector<MyModel, VoidCallback>(
selector: (_, model) => model.increment,
builder: (_, increment) {
return RaisedButton(
onPressed: increment,
child: Child(),
);
},
);
}

关于flutter - 在 flutter 中使用提供者时如何避免不必要的重建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56505298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com