我如何使用颤动中的按钮暂停或恢复异步任务?

问题描述 投票:0回答:1

我正在构建Flutter应用程序,该应用程序需要在一段时间后更改图像。我认为将while循环与内部的sleep方法一起使用可能会解决问题。但事实并非如此,在循环结束后,Image只会发生变化。应用程序用户界面也被冻结。

所以,我使用了无法通过按钮控制的异步任务。

所需的输出:应该每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);
        await Future.delayed(const Duration(seconds: 10));
        setState(() {
          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(() {
                inc();
                BtnTxt = 'PAUSE';
                varToCheckButtonPress = 1;
              });
            } else if (varToCheckButtonPress == 1) {
              setState(() {
                BtnTxt = 'RESUME';
                varToCheckButtonPress = 0;
              });
            }
          },
        )
      ],
    );
  }
}

我希望用户使用单个按钮 具有开始,暂停和恢复]来控制UI。>我们可以使用常规功能来实现此功能吗?

我正在构建Flutter应用程序,该应用程序需要在一段时间后更改图像。我认为将while循环与内部的sleep方法一起使用可能会解决问题。但事实并非如此,图片仅是...

flutter dart flutter-layout
1个回答
1
投票

您应该使用Bloc模式来管理状态,例如StreamBuilder,Providers,并设置一个计时器将新的imageUrl推送到接收器,并让streamBuilder接收最新的imageUrl。

© www.soinside.com 2019 - 2024. All rights reserved.