Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 使用flatterprovider包选择器小部件重建不必要的小部件_Flutter_Flutter Provider - Fatal编程技术网

Flutter 使用flatterprovider包选择器小部件重建不必要的小部件

Flutter 使用flatterprovider包选择器小部件重建不必要的小部件,flutter,flutter-provider,Flutter,Flutter Provider,当我使用Provider.of(context,listen:true)更新ChangeNotifier类实例变量时,value所有依赖于该类的选择器小部件都会重新生成(就像我使用的是消费者而不是选择器小部件一样)。如果我使用Provider.of(context,listen:false).value更新实例变量,Selector小部件和相关的Selector:参数仅根据更改的数据正确更新小部件 import 'package:flutter/material.dart'; import 'p

当我使用
Provider.of(context,listen:true)更新
ChangeNotifier
类实例变量时,value
所有依赖于该类的
选择器
小部件都会重新生成(就像我使用的是
消费者
而不是
选择器
小部件一样)。如果我使用
Provider.of(context,listen:false).value更新实例变量,
Selector
小部件和相关的
Selector:
参数仅根据更改的数据正确更新小部件

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

void main() => runApp(AppMain());

class ModState with ChangeNotifier {
  int _counter0 = 0;
  int get counter0 => _counter0;
  set counter0(int _value) {
    _counter0 = _value;
    notifyListeners();
  }

  int _counter1 = 0;
  int get counter1 => _counter1;
  set counter1(int _value) {
    _counter1 = _value;
    notifyListeners();
  }

    int get counter012 => (_counter0 + _counter1);

  static ModState of(BuildContext context, {bool listen = true}) =>
      Provider.of<ModState>(context, listen: listen);
}

class AppMain extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
        providers: [ChangeNotifierProvider(builder: (_) => ModState())],
        child: MaterialApp(home: Scaffold(
            // Wrap in Builder Widget to clarify context
            body: Builder(builder: (context) {
          return SafeArea(
              child: Column(children: <Widget>[
            Row(
              children: <Widget>[
                Tooltip(
                  message: 'Update counter 0, rebuild counter 0 Text widget',
                  child: RaisedButton(
                    onPressed: () {
                      // Counterintuitively, user Provider.of<mode>(context, listen: false) to avoid rebuilding all children
                      ModState.of(context, listen: false).counter0++;
                      debugPrint(
                          'Counter0: button pressed ${ModState.of(context, listen: false).counter0}');
                    },
                    child: Text('Update 0, rebuild 0'),
                  ),
                ),
                Selector<ModState, int>(
                  selector: (_, _state) => _state.counter0,
                  builder: (_, _data, __) {
                    debugPrint(
                        'Counter0, builder invoked ${ModState.of(context, listen: false).counter0}');
                    return Text(
                        '$_data / ${ModState.of(context, listen: false).counter012}');
                  },
                )
              ],
            ),
            Row(
              children: <Widget>[
                Tooltip(
                  message: 'Update counter 1, rebuild counter 1 Text widget',
                  child: RaisedButton(
                    onPressed: () {
                      // Counterintuitively, user Provider.of<mode>(context, listen: false) to avoid rebuilding all children
                      ModState.of(context, listen: false).counter1++;
                      debugPrint(
                          'Counter1: button pressed ${ModState.of(context, listen: false).counter1}');
                    },
                    child: Text('Update 1, rebuild 1'),
                  ),
                ),
                Selector<ModState, int>(
                  selector: (_, _state) => _state.counter1,
                  builder: (_, _data, __) {
                    debugPrint(
                        'Counter1, builder invoked ${ModState.of(context, listen: false).counter1}');
                    return Text(
                        '$_data / ${ModState.of(context, listen: false).counter012}');
                  },
                )
              ],
            ),
          ]));
        }))));
  }
}
导入“包装:颤振/材料.省道”;
导入“包:provider/provider.dart”;
void main()=>runApp(AppMain());
使用ChangeNotifier类ModState{
int _计数器0=0;
int get counter0=>_counter0;
设置计数器0(int_值){
_计数器0=_值;
notifyListeners();
}
int _counter1=0;
int get counter1=>_counter1;
设置计数器1(int_值){
_计数器1=_值;
notifyListeners();
}
int get counter012=>(_counter0+_counter1);
静态ModState(BuildContext上下文,{bool listen=true})=>
Provider.of(上下文,listen:listen);
}
类AppMain扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
提供程序:[ChangeNotifierProvider(生成器:(\u)=>ModState())],
儿童:MaterialApp(家庭:脚手架)(
//包装在生成器小部件中以澄清上下文
body:Builder(Builder:(上下文){
返回安全区(
子项:列(子项:[
划船(
儿童:[
工具提示(
消息:“更新计数器0,重建计数器0文本小部件”,
孩子:升起按钮(
已按下:(){
//与直觉相反,user Provider.of(context,listen:false)可以避免重建所有子级
of(context,listen:false).counter0++;
调试打印(
'计数器0:按钮按下${ModState.of(context,listen:false).Counter0}';
},
子项:文本(“更新0,重新生成0”),
),
),
选择器(
选择器:(u,_state)=>_state.0,
生成器:(u,u数据,uu){
调试打印(
'Counter0,生成器调用了${ModState.of(context,listen:false).Counter0}';
返回文本(
“$_data/${ModState.of(context,listen:false).counter012}”);
},
)
],
),
划船(
儿童:[
工具提示(
消息:“更新计数器1,重建计数器1文本小部件”,
孩子:升起按钮(
已按下:(){
//与直觉相反,user Provider.of(context,listen:false)可以避免重建所有子级
of(context,listen:false).counter1++;
调试打印(
'计数器1:按钮按下${ModState.of(context,listen:false).Counter1}';
},
子项:文本(“更新1,重建1”),
),
),
选择器(
选择器:(u,_state)=>_state.counter1,
生成器:(u,u数据,uu){
调试打印(
'Counter1,生成器调用了${ModState.of(context,listen:false).Counter1}';
返回文本(
“$_data/${ModState.of(context,listen:false).counter012}”);
},
)
],
),
]));
}))));
}
}

虽然我的now代码可以工作,但就我对该参数的理解而言,使用
listen:false
参数是违反直觉的。我想了解为什么,以便我可以改进我的代码,更具体地说,您的问题是“为什么在按下按钮时调用Provider.of会使小部件更频繁地重建?”?或者我遗漏了什么?相关的。在这种情况下,我现在很高兴跟踪问题#40491这有关系吗?作为一名新的flutter程序员,我试图遵循我所理解的“最佳实践”,即限制小部件的重建。从我的观点来看,选择器小部件除了减少小部件的重建之外没有什么意义,也许我完全理解错了?你的问题实际上与选择器无关。至少不是直接的。在您的情况下,重建的不是选择器,而是构建器。感谢您迄今为止的回复。我需要考虑一下。我的时区也在追上我