【问题标题】:How Can I Update Image after few seconds in flutter?如何在颤动几秒钟后更新图像?
【发布时间】:2020-04-12 23:08:46
【问题描述】:

我正在构建一个需要在一段时间后更改图像的 Flutter 应用程序。我认为在内部使用带有睡眠方法的while循环可能会解决问题。但它没有,图像只有在循环结束后才会改变。应用程序 UI 也被冻结。

所需的输出:图像应每 10 秒更改一次。

图像和按钮文本未更新循环运行时,请帮助我获得所需的输出。


import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
  return MaterialApp(
    home: Scaffold(
      body: Center(
        child: Test(
        ),
      ),
    )
  );
  }}
class Test extends StatefulWidget {
  @override
  _TestState createState() => _TestState();
}

class _TestState extends State<Test> {
  int imgnumber=1;
  int varToCheckButtonPress = 0;
  String BtnTxt = "START";
  void inc(){
    while(imgnumber<10)
      {
        print(imgnumber);
        setState(() {
          sleep(Duration(seconds:5));
          imgnumber++;
        });
      }
  }
  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: <Widget>[
        Expanded(flex: 1,
          child: Container(
            child: Image.asset('images/'+imgnumber.toString()+'.png'),
            height: 500,
            width:500,
            color: Colors.green,
          ),
        ),
        FlatButton(
          child: Text(BtnTxt),
          onPressed: (){
            if (varToCheckButtonPress == 0) {
              setState(() {
                BtnTxt = 'PAUSE';
                varToCheckButtonPress = 1;
              });
            } else if (varToCheckButtonPress == 1) {
              setState(() {
                BtnTxt = 'RESUME';
                varToCheckButtonPress = 0;
              });
            }
            inc();
          },
        )
      ],
    );
  }
}

【问题讨论】:

    标签: flutter dart flutter-layout


    【解决方案1】:

    你不应该在 setState 中使用 sleep 尝试用这个替换 inc 函数:

    void inc() async {
        while(imgnumber<10)
          {
            print(imgnumber);
            await Future.delayed(const Duration(seconds: 10));
            setState(() {
              imgnumber++;
            });
          }
      }
    

    【讨论】:

    • 没有异步如何实现?因为我希望我的用户暂停和恢复这个方法。
    • @Creator 会更复杂,我建议您将延迟更改为 1 秒并在更改图像编号之前运行 10 次,并且每次运行时长检查是否为布尔变量是真的(假设是 isPused)。该变量将在开始时设置为 false (initState),并在用户单击 puase/resume 按钮时更改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2015-10-28
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多