flutter - Flutter AnimationBuilder 无法与提供者状态管理一起使用
问题描述
当用户点击“点击以激活动画”按钮时,我正在尝试使用提供者状态管理使用 AnimationBuilder 为绿色“动画框”容器设置动画。
“动画框”容器应该是定位小部件的子级,因此是堆栈小部件的子级,因为我希望堆栈小部件中有多个“动画框”。
下面给出的示例代码没有按预期工作。
有人可以提出解决方案吗?
发布规范.yaml
name: sampleapp
description: A new Flutter project.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: ">=2.7.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^1.0.0
provider: ^5.0.0
dev_dependencies:
flutter_test:
sdk: flutter
flutter:
uses-material-design: true
main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
void main() {
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => MessageModel()),
],
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
Size _size = MediaQuery.of(context).size;
return Scaffold(
appBar: AppBar(
title: Text('Flutter Provider Animation'),
),
body: Center(
child: Column(
children: [
Stack(
children: <Widget>[
TweenAnimationBuilder(
tween: Tween(
begin: context.watch<MessageModel>().getMessageBeginTween,
end: context.watch<MessageModel>().getMessageEndTween,
),
duration: Duration(milliseconds: 500),
curve: Curves.elasticOut,
builder: (_, double value, __) {
return Positioned(
left: _size.width * 0.5 - _size.width * 0.6 * 0.5,
top: 100,
child: Container(
width: _size.width * 0.6,
height: _size.height * 0.1,
color: Colors.green,
child: Center(child: Text('Animated Box')),
),
);
},
),
SizedBox(width: _size.width, height: _size.height * 0.4),
],
),
SizedBox(width: _size.width, height: _size.height * 0.1),
InkWell(
onTap: () {
context.read<MessageModel>().updateGridMessageTween(
isVisible ? 50 : 10, isVisible ? 10 : 50);
print('1 $isVisible');
isVisible = !isVisible;
print('2 $isVisible');
},
child: Container(
width: _size.width * 0.6,
height: _size.height * 0.05,
color: Colors.grey,
child: Center(child: Text('Tap to Activate the Animation')),
),
)
],
),
),
);
}
}
bool isVisible = true;
class MessageModel with ChangeNotifier {
double _tweenBegin = 10.0;
double _tweenEnd = 10.0;
double get getMessageBeginTween => _tweenBegin;
double get getMessageEndTween => _tweenEnd;
void updateGridMessageTween(double begin, double end) {
print('3 $isVisible');
_tweenBegin = begin;
_tweenEnd = end;
notifyListeners();
}
}
解决方案
推荐阅读
- exchangewebservices - Microsoft.Exchange.WebServices.dll 在 .netCore 和 .net 标准中不起作用
- visual-studio-code - 如何在 Visual Studio Code 中部署独立的 .exe 文件?
- javascript - .NET Core 3.1 中带有 Bootsrap、图像和 css 的 HTLM 到 PDF
- javascript - ckeditor - 如何从编辑器到 php 函数进行 onchange
- python - 如何在python的Threadpoolexecutor中运行异步函数
- html - 防止 Bootstrap 按钮中的 fontawesome 图标单独换行到下一行
- charts - ChartJS - 在同一日期具有多个值的图形
- google-sheets - 谷歌表格 - 将脚本分配给一个按钮,该按钮将根据第三个单元格信息将新数据从一个单元格粘贴到另一个单元格
- python - 并发运行相同的查询(每六分钟)锁定一个 PostgreSQL 表
- python - 烧瓶 | Heroku buildpack:odbc | 为 SQL Server 安装 ODBC 驱动程序 17 | Heroku buildpack-apt 上的错误