我有下一个小部件,它使用 StreamBuilder 来监听绘制列表。\n(我省略了不相关的细节)
\nclass CloseUsersFromStream extends StatelessWidget {\n final Stream<List<User>> _stream;\n const CloseUsersFromStream(this._stream);\n\n @override\n Widget build(BuildContext context) {\n return StreamBuilder<List<User>>(\n stream: _stream,\n builder: _buildWidgetFromSnapshot,\n );\n }\n\n Widget _buildWidgetFromSnapshot(_, AsyncSnapshot<List<User>> snapshot) {\n if (_snapshotHasLoaded(snapshot)) {\n return UsersButtonsList(snapshot.data!);\n } else {\n return const Center(child: CircularProgressIndicator());\n }\n }\n\n bool _snapshotHasLoaded(AsyncSnapshot<List<User>> snapshot) {\n return snapshot.hasData;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n及其父级:
\nclass CloseUsersScreen extends StatefulWidget {\n final ICloseUsersService _closeUsersService;\n\n const CloseUsersScreen(this._closeUsersService);\n\n @override\n State<CloseUsersScreen> createState() => _CloseUsersScreenState();\n}\n\nclass _CloseUsersScreenState extends State<CloseUsersScreen> {\n late final Stream<List<User>> …Run Code Online (Sandbox Code Playgroud) 我试图在一个类中使用periodic该类的方法Timer,该类扩展了该类ChangeNotifier(包Provider),使我的变量time每秒都在减少。
如果我不添加NotifyListeners重绘占用该time属性的所有小部件的方法,则此方法可以正常工作,例如:
class PriceProvider extends ChangeNotifier{
int _time = 60;
int get time{
return _time;
}
void chronometer(){//method which activate the timer
Timer _timer = Timer.periodic(const Duration(seconds: 1), (Timer timer){
print(DateTime.now());//I print the date so you can see how often the code is executed
_time += -1;//decrease time
if(_time == 0){
_time = 60;
}
// notifyListeners();
});
}
}
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我取消对该NotifyListeners方法的注释,代码开始以指数方式每秒执行越来越多的次数(例如,首先执行一次,然后两次,然后 5 次,然后 …