Я создал новый проект и попробовал ваш код. Во-первых, если вы используете Provider, вы должны использовать ChangeNotifier с вашими классами управления. Также вы должны использовать ChangeNotifierProvider с вашим основным классом. Это мои коды, которые работают хорошо.
main.dart
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: ChangeNotifierProvider(
create: (context) => AppBarAnimatedIconMode(), // This is condition class.
child: Home(),
),
);
}
}
AppBarAnimatedIconMode.dart
class AppBarAnimatedIconMode with ChangeNotifier {
final ValueNotifier<bool> iconMode = ValueNotifier<bool>(false);
// ignore: use_setters_to_change_properties
void changeIconMode() {
iconMode.value = !iconMode.value;
notifyListeners(); // For change the state of icon value.
}
}
AppBarAnimatedIcon.dart
class AppBarAnimatedIcon extends StatefulWidget {
final bool animate;
const AppBarAnimatedIcon({@required this.animate});
@override
State<StatefulWidget> createState() => _AppBarAnimatedIcon();
}
class _AppBarAnimatedIcon extends State<AppBarAnimatedIcon> with SingleTickerProviderStateMixin {// You should use SingleTickerProviderStateMixin //
AnimationController _animationController;
bool get _animate => widget.animate;
@override
void initState() {
super.initState();
_animationController = AnimationController(vsync: this, duration: const Duration(milliseconds: 500));
}
@override
void dispose() { // Also dispose your animation when you dispose the class.
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (_animate) { // You should check your conditions in your build() for animate
_animationController.forward();
} else {
_animationController.reverse();
}
return Center(
child: AnimatedIcon(
icon: AnimatedIcons.menu_close,
progress: _animationController,
),
);
}
}
Таким образом, вы можете управлять своей анимацией, как эта функция:
RaisedButton(
child: Text('Change'),
onPressed: () {
var provider = Provider.of<AppBarAnimatedIconMode>(context, listen: false);
provider.changeIconMode();
},
Также на вашем AppBar вы можете использовать это код. У тебя все сложно.
AppBar(
title: Text('Deneme'),
leading: Consumer<AppBarAnimatedIconMode>(
builder: (context, mode, child) => AppBarAnimatedIcon(
animate: mode.iconMode,
),
),
),
А для AppBarAnimatedIconMode.dart
class AppBarAnimatedIconMode with ChangeNotifier {
bool iconMode = false;
void changeIconMode() {
iconMode = !iconMode;
notifyListeners();
}
}