gpt4 book ai didi

dart - 在 flutter 中定期更新显示

转载 作者:IT王子 更新时间:2023-10-29 07:00:20 25 4
gpt4 key购买 nike

在 flutter 中,我们希望定期更新显示。我们可以在值更改时更新显示。但是,在这种情况下设置值不会改变。因此,我们不知道如何触发更新显示。

我们从 Stateless Widget 变成了 Stateful Widget。而我们在initState()中启动了定时器,在dispose()中取消了定时器。我们定期调用 ScopedModel 上的 notifyListeners () 并更新绘图。

它按预期工作。不幸的是,这不是一个美丽的方式。这很难理解,很烦人。你不知道更好的方法吗?我们应该怎么做?

我们将在下面阐明我们的实现示例。这是一个最小的代码。

xxxxx_widget.dart

import 'package:flutter/material.dart';
import 'package:pregnancy/scoped_model/xxxxx_model.dart';
import 'package:pregnancy/widgets/yyyyy_widget.dart';
import 'package:scoped_model/scoped_model.dart';

class XxxxxWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ScopedModel<XxxxxModel>(
model: XxxxxModel(),
child: YyyyyWidget(),
);
}
}

yyyyy_widget.dart

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:pregnancy/scoped_model/xxxxx_model.dart';
import 'package:scoped_model/scoped_model.dart';

class YyyyyWidget extends StatefulWidget {
@override
YyyyyWidgetState createState() {
return new YyyyyWidgetState();
}
}

class YyyyyWidgetState extends State<YyyyyWidget> {
Timer _timer;

@override
void initState() {
_timer = Timer.periodic(
const Duration(milliseconds: 500),
(Timer t) {
XxxxxModel.of(context).notify();
},
);
super.initState();
}

@override
void dispose() {
_timer.cancel();
_timer = null;
super.dispose();
}

@override
Widget build(BuildContext context) {
return ScopedModelDescendant<XxxxxModel>(
builder: (context, child, model) {
var diff = model.datetime.difference(DateTime.now());
var hours = diff.inHours.remainder(Duration.hoursPerDay);
var minutes = diff.inMinutes.remainder(Duration.minutesPerHour);
var seconds = diff.inSeconds.remainder(Duration.secondsPerMinute);
return Text('${hours} hours ${minutes} minutes ${seconds} seconds');
},
);
}
}

xxxxx_model.dart

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

class XxxxxModel extends Model {
static XxxxxModel of(BuildContext context) =>
ScopedModel.of<XxxxxModel>(context);

DateTime _datetime = DateTime.now().add(Duration(days: 1));

get datetime => _datetime;

set datetime(DateTime value) {
_datetime = value;
notifyListeners();
}

void notify() {
notifyListeners();
}
}

最佳答案

您可以使用 StreamBuilder 来监听间隔流。它会自动管理订阅。

您的模型可以将流作为属性提供。

关于dart - 在 flutter 中定期更新显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52096914/

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