flutter 嵌套 StatefulWidget 不刷新

widget1 中有一个按钮和 widget2 ,

点击一次按钮 数字i+1,调用 widget2(i); widget1 widget2 都是 StatefulWidget 

import 'package:flutter/material.dart';
import 'package:stack_trace/stack_trace.dart';
import 'dart:developer' as dev;

void main() {
  runApp(MaterialApp(title: 'Dict', home: Scaffold(body: widget1())));
}

class widget1 extends StatefulWidget {
  @override
  State<widget1> createState() => widget1_();
}

class widget1_ extends State<widget1> {
  int i=1;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        ElevatedButton(
          child: Text("normal"),
          onPressed: () {
            setState(() {
              i=i+1;
            });
          },
        ),
        widget2(i)
      ],
    );
  }
}


class widget2 extends StatefulWidget {
  int i;
  widget2(this.i) {
    //这一行能够收到变化
    debug(i.toString());
  }
  @override
  State<widget2> createState() => widget2_(i);
}

class widget2_ extends State<widget2> {
  int i;
  widget2_(this.i) {
    //这里不会变化 甚至变化的时候都不会重新执行这里的代码
    debug(i.toString());
  }
  @override
  Widget build(BuildContext context) {
    return Text(i.toString());
  }
}
debug(Object? object,[int i=1]) {
  if(i>0){
    //获取 调用当前程序 所在 的文件 以及具体的行
    //将 StackTrace 对象转换成 Chain 对象
    //toTrace().frames // 拿出其中一条信息
    //[1] 上一层
    var frame = Chain.current().toTrace().frames[i];
    print("file :${frame.uri} line ${frame.line}");
  }
  var str = object.toString();
  if(str.length>450){
    dev.log(str);
  }
  print(object);
}

1.传递一个UniqueKey()可以解决 让它强制刷新,

2.或者使用 ValueKey(),

3.GlobalKey bKey = GlobalKey();textKey.currentState.onPressed(_count); 这个方案测试无效

import 'package:flutter/material.dart';
import 'package:stack_trace/stack_trace.dart';
import 'dart:developer' as dev;

void main() {
  runApp(MaterialApp(title: 'Dict', home: Scaffold(body: widget1())));
}

class widget1 extends StatefulWidget {
  @override
  State<widget1> createState() => widget1_();
}

class widget1_ extends State<widget1> {
  int i=1;

  @override
  Widget build(BuildContext context) {
    return Row(
      children: [
        ElevatedButton(
          child: Text("normal"),
          onPressed: () {
            setState(() {
              i=i+1;
            });
          },
        ),
        widget2(i,ValueKey(i))
      ],
    );
  }
}


class widget2 extends StatefulWidget {
  int i;
  Key key;
  widget2(this.i,this.key) {
    //这一行能够收到变化
    debug(i.toString());
  }
  @override
  State<widget2> createState() => widget2_(i);
}

class widget2_ extends State<widget2> {
  int i;
  widget2_(this.i) {
    //这里不会变化 甚至变化的时候都不会重新执行这里的代码
    debug(i.toString());
  }
  @override
  Widget build(BuildContext context) {
    return Text(i.toString());
  }
}
debug(Object? object,[int i=1]) {
  if(i>0){
    //获取 调用当前程序 所在 的文件 以及具体的行
    //将 StackTrace 对象转换成 Chain 对象
    //toTrace().frames // 拿出其中一条信息
    //[1] 上一层
    var frame = Chain.current().toTrace().frames[i];
    print("file :${frame.uri} line ${frame.line}");
  }
  var str = object.toString();
  if(str.length>450){
    dev.log(str);
  }
  print(object);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值