Когда вы вызываете setState
, он перестраивает только те виджеты, которые содержат метод build
.
Основная проблема заключалась в том, что вы этого не делали.Вы не перестроили _child
в build
методе.
Эта строка в вашем коде неверна: if (_child == null) _child = _buildButton();
Если вы сделаете так, как это _child = _buildButton();
, тогда сработает только кнопка +/ -, но не работает изменить текст.Нужен рефакторинг вашего кода!
Итак, я произвел рефакторинг вашего кода и добавил ChildType
, который указывает, какой виджет вы хотите показать: текст или кнопка.А затем используйте его в методе setState
.Теперь все работает, как вы и ожидали:)
import 'package:flutter/material.dart';
import 'dart:core';
class TestIconChange extends StatefulWidget {
@override
_TestIconChangeState createState() => _TestIconChangeState();
}
enum ChildType {text, button}
class _TestIconChangeState extends State<TestIconChange>
with TickerProviderStateMixin {
ChildType curChildType = ChildType.button;
IconData _iconData = Icons.add;
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
AnimatedSwitcher(
duration: Duration(milliseconds: 100),
child: _buildButton(),
),
RaisedButton(
child: Text('Text Child'),
onPressed: (() {
setState(() {
curChildType = ChildType.text;
});
}),
),
RaisedButton(
child: Text('Button Child'),
onPressed: (() {
setState(() {
curChildType = ChildType.button;
},);
}),
)
],
),
),
);
}
Widget _buildButton() {
if (curChildType == ChildType.text) {
return Text('Dummy text');
}
else {
return IconButton(
icon: Icon(_iconData),
onPressed: () {
setState(() {
_iconData = (_iconData == Icons.add) ? Icons.remove : _iconData = Icons.add;
});
},
);
}
}
}
Удачи!