Flutter问题记录:StatefulWidget嵌套使用界面不刷新问题

StatefulWidget嵌套使用界面不刷新问题

现象:B使用了AWidget,此时B有state变化,界面不刷新

嵌套逻辑如下图


Flutter问题记录:StatefulWidget嵌套使用界面不刷新问题_第1张图片
嵌套图解.jpg

A Widget是封装的TitleBar,content是外部传入
B是使用A Widget,内容是B类中封装了一个方法来获取的Widget

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:my_flutter/utils/config.dart';

class TitleBarWidget extends StatefulWidget {
  String title;
  Widget leftWidget, rightWidget;
  Widget contentWidget;
  bool isHasBack;

  TitleBarWidget({Key key,this.title,this.isHasBack, this.leftWidget, this.rightWidget, this.contentWidget} ): super(key: key);
  @override
  State createState() {
    return _TitleBarWidgetState(this.contentWidget);
  }
}

class _TitleBarWidgetState extends State {

  Widget contentWidget;

  _TitleBarWidgetState(this.contentWidget);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SafeArea(
        child: Stack(
          children: [
            Container(
              color: Colors.white,
              padding: EdgeInsets.only(top: 44),
              child: contentWidget,
            ),
            _getAppBarWidget()
          ],
        ),
      ),
    );
  }

  Widget _getAppBarWidget() {
    return Container(
      height: 44,
      padding: EdgeInsets.only(left: 15, right: 15),
      child: _getContentWidget(),
    );
  }

  Widget _getContentWidget() {
    return Stack(
      alignment: Alignment.centerLeft,
      children: [
        Container(
          alignment: Alignment.center,
          child: Text(widget.title ?? '',
              style: TextStyle(fontSize: 17, color: Color(Config.COLOR_1A1A1A), fontWeight: FontWeight.bold)),
        ),
        widget.leftWidget == null ? Container(
          child: _getBackWidget(),
        ):
        Row(
          children: [
            _getBackWidget(),
            widget.leftWidget
          ],
        ),
        Container(
          alignment: Alignment.centerRight,
          child: widget.rightWidget ?? Text(''),
        )
      ],
    );
  }

  Widget _getBackWidget() {
    return Container(
      height: 49,
      padding: EdgeInsets.all(3),
      child: GestureDetector(
        child: Image.asset(Config.IMG_PATH_COMMON + 'icon_back.png', width: 18, height: 16,),
        onTap: () {
          Navigator.of(context).pop();
        },
      ),
    );
  }

}

B类

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:my_flutter/comment_widget/title_bar_widget.dart';

class TestStateFulPage extends StatefulWidget {
  @override
  State createState() {
    return _TestPageState();
  }
}

class _TestPageState extends State {

  int numbner = 1;

  @override
  Widget build(BuildContext context) {
    print('TestPage build()');
    return TitleBarWidget(
      title: '我是B类',
      contentWidget: _getContentWidet(),
    );
  }

  Widget _getContentWidet() {
    return Column(
      children: [
        Text('当前$numbner'),
        FlatButton(
          child: Text('+'),
          onPressed: () {
            setState(() {
              numbner ++;
            });
          },
        )
      ],
    );
  }

}

解决办法:A中不向state类传入参数,state类中使用widget.contentWiget方式使用参数

Flutter问题记录:StatefulWidget嵌套使用界面不刷新问题_第2张图片
解决办法.jpg

你可能感兴趣的:(Flutter问题记录:StatefulWidget嵌套使用界面不刷新问题)