Flutter 从另一个窗口返回后,在flatter中重新绘制窗口小部件

Flutter 从另一个窗口返回后,在flatter中重新绘制窗口小部件,flutter,widget,redraw,flutter-futurebuilder,Flutter,Widget,Redraw,Flutter Futurebuilder,我有一门二等飞镖课。其中有ImageSequenceAnimator和LinearPercentIndicator,当控件通过弹出另一个类到达MainExerceSClass dart时,应该重新启动它们。count1正在更新,但ImageSequenceAnimator未更新。 下面是代码 class MainExerseClass extends StatefulWidget { @override State<Stat

我有一门二等飞镖课。其中有ImageSequenceAnimator和LinearPercentIndicator,当控件通过弹出另一个类到达MainExerceSClass dart时,应该重新启动它们。count1正在更新,但ImageSequenceAnimator未更新。 下面是代码

 class MainExerseClass extends StatefulWidget {
    
    
    
    
      @override
      State<StatefulWidget> createState() {
        // TODO: implement createState
        return Exersise();
    
      }
    }
    
    class Exersise extends State<MainExerseClass> with WidgetsBindingObserver{
      var count1;
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        if (state == AppLifecycleState.resumed) {
          //do your stuff
          _requestSqlData();
        }
      }
      @override
      void dispose() {
        WidgetsBinding.instance.removeObserver(this);
        super.dispose();
      }
    
      @override
      void initState() {
        // TODO: implement initState
        //count1 = widget.progress;
        _requestSqlData();
    
        super.initState();
      }
    
    
    
      void _requestSqlData() {
        _requestSqlDataAsync();
      }
    
      void _requestSqlDataAsync() async {
        int i = await DatabaseHelper.instance.getDayExcCounter("Day 1");
        setState(() {
          count1 = i;
        });
    
        print(count1);
      }
      void _gotoB() async {
    
        String parameter = await Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => Resttimer(ExcerciselistPojo.randomList[count1].name,count1.toString())),
        );
    
        setState(() {
          count1 = int.tryParse(parameter);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        // TODO: implement build
        SizeConfig().init(context);
        return Scaffold(
            body: new Column(
          children: <Widget>[
            new Row(
              children: <Widget>[
                Builder(
                  builder: (context) => IconButton(
                    icon: Icon(Icons.arrow_back),
                    iconSize: 30,
                    onPressed: () {
                      // Here i want context
                      if (Navigator.canPop(context)) {
                        Navigator.pop(context);
                      } else {
                        SystemNavigator.pop();
                      }
                    },
                  ),
                ),
                new Container(
                    margin: const EdgeInsets.fromLTRB(20, 0, 0, 0),
                    child: new Text("Exercise",
                        style: new TextStyle(
                            color: Colors.black,
                            fontSize: 25,
                            fontWeight: FontWeight.bold)))
              ],
            ),
            new Container(
                margin: const EdgeInsets.fromLTRB(0, 10, 0, 0),
                child: IntervalProgressBar(
                    direction: IntervalProgressDirection.horizontal,
                    max: ExcerciselistPojo.randomList.length,
                    progress: count1,
                    intervalSize: 2,
                    size: Size(600, 10),
                    highlightColor: Colors.pink,
                    defaultColor: Colors.grey,
                    intervalColor: Colors.transparent,
                    intervalHighlightColor: Colors.transparent,
                    reverse: false,
                    radius: 0)),
            new Container(
              margin: EdgeInsets.fromLTRB(0, 5, 0, 0),
              child: new Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: <Widget>[
                  new Container(
                    height: 30,
                    alignment: Alignment.centerLeft,
                    child: FlatButton(
    
                      child: Image.asset("assets/images/play.webp"),
                      onPressed: () async {
                        //_updatecountertodb();
                        count1--;
                        if(count1<0)
                          count1=0;
                        await DatabaseHelper.instance.insertExcCounter("Day 1", count1);
                        _gotoB();
                      },
                    ),
                  ),
                  new Container(
                    height: 30,
                    alignment: Alignment.centerRight,
                    child: FlatButton(
    
                      child: Image.asset("assets/images/play.webp"),
                      onPressed: () async {
                        //_updatecountertodb();
                        count1++;
                        if(count1>5)
                          count1=0;
                        await DatabaseHelper.instance.insertExcCounter("Day 1", count1);
                        _gotoB();
                      },
                    ),
                  )
                ],
              ),
            ),
            new Container(
              margin: EdgeInsets.fromLTRB(0, 0, 0, 0),
              child: new ImageSequenceAnimator(
                "assets/images/" + ExcerciselistPojo.randomList[count1].imageUrl,
                "Pic_",
                0,
                5,
                "webp",
                3,
                isAutoPlay: true,
                color: null,
                fps: 2,
                isLooping: true,
    
              ),
              height: 300,
            ),
            new Container(
              margin: EdgeInsets.fromLTRB(0, 0, 5, 0),
              alignment: Alignment.centerRight,
              child: IconButton(
                icon: Image.asset("assets/images/rest_time_exc.png"),
                onPressed: () {},
              ),
            ),
            new Container(
              margin: EdgeInsets.fromLTRB(10, SizeConfig.screenHeight /16, 0, 0),
              alignment: Alignment.centerLeft,
              child: new Text(ExcerciselistPojo.randomList[count1].name,
                  style: new TextStyle(
                      fontSize: 25,
                      fontWeight: FontWeight.bold,
                      color: Colors.blueGrey)),
            ),
            new Container(
              margin: EdgeInsets.fromLTRB(0, SizeConfig.screenHeight /44, 0, 0),
              child: new LinearPercentIndicator(
                animation: true,
                animationDuration: 6000,
                lineHeight: SizeConfig.screenHeight / 10,
                percent: 1,
                center: Text("100/68%"),
                linearStrokeCap: LinearStrokeCap.butt,
                progressColor: Colors.pink,
              ),
            )
          ],
        ));
    
    
      }
    
    
    }

在MainExerseClass中,计数正在更新,但ImageSequenceAnimator未刷新,它正在显示旧动画。我想重新启动LinearPercenticator。

我相信通过将UniqueKey传递给要再次呈现的小部件,您的问题会得到解决,如下所示:

Widget(key: uniqueKey(), ...)

您可以复制粘贴运行下面的完整代码
要允许下面的演示工作,您需要将
png
文件从 到

您不需要使用
“assets/images/”+exerciselistpojo.randomList[count1].imageUrl

您可以直接使用imageSequenceAnimator.skip(count1.toDouble())

代码片段

  ImageSequenceAnimatorState imageSequenceAnimator;

  void onReadyToPlay(ImageSequenceAnimatorState _imageSequenceAnimator) {
    imageSequenceAnimator = _imageSequenceAnimator;
  }

  void onPlaying(ImageSequenceAnimatorState _imageSequenceAnimator) {
    setState(() {});
  }

  void _gotoB() async {
    String parameter = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => RouteB()),
    );

    setState(() {
      count1 = int.tryParse(parameter);
      imageSequenceAnimator.skip(count1.toDouble());
    });
  }
工作演示

完整代码

import 'package:flutter/material.dart';
import 'package:intervalprogressbar/intervalprogressbar.dart';
import 'package:image_sequence_animator/image_sequence_animator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int count = 30;
  int count1 = 3;

  ImageSequenceAnimatorState imageSequenceAnimator;

  void onReadyToPlay(ImageSequenceAnimatorState _imageSequenceAnimator) {
    imageSequenceAnimator = _imageSequenceAnimator;
  }

  void onPlaying(ImageSequenceAnimatorState _imageSequenceAnimator) {
    setState(() {});
  }

  void _gotoB() async {
    String parameter = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => RouteB()),
    );

    setState(() {
      count1 = int.tryParse(parameter);
      imageSequenceAnimator.skip(count1.toDouble());
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              flex: 4,
              child: Padding(
                padding: EdgeInsets.all(25),
                child: ImageSequenceAnimator(
                  "assets/ImageSequence",
                  "Frame_",
                  0,
                  5,
                  "png",
                  60,
                  isAutoPlay: false,
                  color: Colors.blue,
                  onReadyToPlay: onReadyToPlay,
                  onPlaying: onPlaying,
                ),
              ),
            ),
            Expanded(
              flex: 2,
              child: Container(
                  margin: const EdgeInsets.fromLTRB(0, 10, 0, 0),
                  child: IntervalProgressBar(
                      direction: IntervalProgressDirection.horizontal,
                      max: count,
                      progress: count1,
                      intervalSize: 2,
                      size: Size(600, 10),
                      highlightColor: Colors.pink,
                      defaultColor: Colors.grey,
                      intervalColor: Colors.transparent,
                      intervalHighlightColor: Colors.transparent,
                      reverse: false,
                      radius: 0)),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _gotoB,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class RouteB extends StatefulWidget {
  @override
  _RouteBState createState() => _RouteBState();
}

class _RouteBState extends State<RouteB> {
  TextEditingController _textEditingController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          body: Column(
        children: [
          TextField(
            controller: _textEditingController,
          ),
          RaisedButton(
            child: Text('Go back'),
            onPressed: () {
              Navigator.pop(context, _textEditingController.text);
            },
          ),
        ],
      )),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“包:intervalprogressbar/intervalprogressbar.dart”;
导入“package:image_sequence_animator/image_sequence_animator.dart”;
void main(){
runApp(MyApp());
}
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
视觉密度:视觉密度。自适应平台密度,
),
主页:MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
整数计数=30;
int count1=3;
ImageSequenceAnimatorState imageSequenceAnimator;
void onReadyToPlay(ImageSequenceAnimatorState\u imageSequenceAnimator){
imageSequenceAnimator=\u imageSequenceAnimator;
}
播放时无效(ImageSequenceAnimatorState\u imageSequenceAnimator){
setState((){});
}
void\u gotoB()异步{
字符串参数=wait Navigator.push(
上下文
MaterialPage路由(生成器:(上下文)=>RouteB()),
);
设置状态(){
count1=int.tryParse(参数);
imageSequenceAnimator.skip(count1.toDouble());
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
扩大(
弹性:4,
孩子:填充(
填充:边缘设置。全部(25),
孩子:ImageSequenceAnimator(
“资产/图像序列”,
“框架”,
0,
5.
“巴布亚新几内亚”,
60,
isAutoPlay:错,
颜色:颜色,蓝色,
onReadyToPlay:onReadyToPlay,
在玩:在玩,
),
),
),
扩大(
弹性:2,
子:容器(
边距:LTRB(0,10,0,0)的常数边集,
孩子:IntervalProgressBar(
方向:IntervalProgressDirection.horizontal,
马克斯:伯爵,
进展情况:第一,
间隔:2,
尺寸:尺寸(600,10),
highlightColor:Colors.pink,
默认颜色:Colors.grey,
intervalColor:颜色。透明,
intervalHighlightColor:颜色。透明,
反面:错,
半径:0),
),
],
),
),
浮动操作按钮:浮动操作按钮(
按下按钮:_gotoB,
工具提示:“增量”,
子:图标(Icons.add),
),
);
}
}
类RouteB扩展了StatefulWidget{
@凌驾
_RouteBState createState()=>\u RouteBState();
}
类_RouteBState扩展状态{
TextEditingController_TextEditingController=TextEditingController();
@凌驾
小部件构建(构建上下文){
返回安全区(
孩子:脚手架(
正文:专栏(
儿童:[
文本字段(
控制器:_textededitingcontroller,
),
升起的按钮(
子项:文本(“返回”),
已按下:(){
pop(上下文,_textededitingcontroller.text);
},
),
],
)),
);
}
}
  ImageSequenceAnimatorState imageSequenceAnimator;

  void onReadyToPlay(ImageSequenceAnimatorState _imageSequenceAnimator) {
    imageSequenceAnimator = _imageSequenceAnimator;
  }

  void onPlaying(ImageSequenceAnimatorState _imageSequenceAnimator) {
    setState(() {});
  }

  void _gotoB() async {
    String parameter = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => RouteB()),
    );

    setState(() {
      count1 = int.tryParse(parameter);
      imageSequenceAnimator.skip(count1.toDouble());
    });
  }
import 'package:flutter/material.dart';
import 'package:intervalprogressbar/intervalprogressbar.dart';
import 'package:image_sequence_animator/image_sequence_animator.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int count = 30;
  int count1 = 3;

  ImageSequenceAnimatorState imageSequenceAnimator;

  void onReadyToPlay(ImageSequenceAnimatorState _imageSequenceAnimator) {
    imageSequenceAnimator = _imageSequenceAnimator;
  }

  void onPlaying(ImageSequenceAnimatorState _imageSequenceAnimator) {
    setState(() {});
  }

  void _gotoB() async {
    String parameter = await Navigator.push(
      context,
      MaterialPageRoute(builder: (context) => RouteB()),
    );

    setState(() {
      count1 = int.tryParse(parameter);
      imageSequenceAnimator.skip(count1.toDouble());
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Expanded(
              flex: 4,
              child: Padding(
                padding: EdgeInsets.all(25),
                child: ImageSequenceAnimator(
                  "assets/ImageSequence",
                  "Frame_",
                  0,
                  5,
                  "png",
                  60,
                  isAutoPlay: false,
                  color: Colors.blue,
                  onReadyToPlay: onReadyToPlay,
                  onPlaying: onPlaying,
                ),
              ),
            ),
            Expanded(
              flex: 2,
              child: Container(
                  margin: const EdgeInsets.fromLTRB(0, 10, 0, 0),
                  child: IntervalProgressBar(
                      direction: IntervalProgressDirection.horizontal,
                      max: count,
                      progress: count1,
                      intervalSize: 2,
                      size: Size(600, 10),
                      highlightColor: Colors.pink,
                      defaultColor: Colors.grey,
                      intervalColor: Colors.transparent,
                      intervalHighlightColor: Colors.transparent,
                      reverse: false,
                      radius: 0)),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _gotoB,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

class RouteB extends StatefulWidget {
  @override
  _RouteBState createState() => _RouteBState();
}

class _RouteBState extends State<RouteB> {
  TextEditingController _textEditingController = TextEditingController();

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Scaffold(
          body: Column(
        children: [
          TextField(
            controller: _textEditingController,
          ),
          RaisedButton(
            child: Text('Go back'),
            onPressed: () {
              Navigator.pop(context, _textEditingController.text);
            },
          ),
        ],
      )),
    );
  }
}