flutter - 如何从另一个类调用 ConfettiController
问题描述
在 MyAppState 中,我创建了一个名为 controllerTopCenter 的 ConfettiController,我从这个包中获得了它 - https://pub.dev/packages/confetti
我还为 MyApp 添加了一个键,希望能触发另一个类的五彩纸屑动画。
在我添加GlobalKey<MyAppState> key = GlobalKey<MyAppState>();
然后添加的另一个类key.currentState.controllerTopCenter.play();
中,每次在应用程序中实现某件事时都会触发它。但是,当它被触发时,我收到错误消息“NoSuchMethodError:null 上的无效成员:'controllerTopCenter'”。
我想知道是什么导致了这个错误。
这是我的代码:
import 'package:flutter/material.dart';
import 'package:confetti/confetti.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
ConfettiController controllerTopCenter;
void initState() {
controllerTopCenter =
ConfettiController(duration: const Duration(seconds: 10))
..addListener(() => setState(() {}));
super.initState();
}
void dispose() {
controllerTopCenter.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
Tap tap = new Tap();
return MaterialApp(
title: 'Sum Mini',
home: Scaffold(
body: Column(
children: [
Align(
alignment: Alignment.center,
child: ConfettiWidget(
confettiController: controllerTopCenter,
blastDirectionality: BlastDirectionality
.explosive, // don't specify a direction, blast randomly
shouldLoop:
true, // start again as soon as the animation is finished
colors: const [
Colors.green,
Colors.blue,
Colors.pink,
Colors.orange,
Colors.purple
], // manually specify the colors to be used
),
),
GestureDetector(
onTap: () {
tap.onTap();
},
child: Container(
width: 100.0,
height: 100.0,
decoration: BoxDecoration(
color: Colors.greenAccent,
shape: BoxShape.circle,
),
),
),
],
),
));
}
}
class Tap {
GlobalKey<MyAppState> key = GlobalKey<MyAppState>();
onTap() {
key.currentState.controllerTopCenter.play();
}
}
任何帮助将不胜感激。
解决方案
您可以在下面复制粘贴运行完整代码
您可以Tap tap
从外部移动build
并传递到MyApp
代码片段
Tap tap = new Tap();
void main() => runApp(MyApp(key: tap.key));
工作演示
完整代码
import 'package:flutter/material.dart';
import 'package:confetti/confetti.dart';
Tap tap = new Tap();
void main() => runApp(MyApp(key: tap.key));
class MyApp extends StatefulWidget {
MyApp({Key key}) : super(key: key);
@override
MyAppState createState() => MyAppState();
}
class MyAppState extends State<MyApp> with SingleTickerProviderStateMixin {
ConfettiController controllerTopCenter;
void initState() {
controllerTopCenter =
ConfettiController(duration: const Duration(seconds: 10))
..addListener(() => setState(() {}));
super.initState();
}
void dispose() {
controllerTopCenter.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Sum Mini',
home: Scaffold(
body: Column(
children: [
Align(
alignment: Alignment.center,
child: ConfettiWidget(
confettiController: controllerTopCenter,
blastDirectionality: BlastDirectionality
.explosive, // don't specify a direction, blast randomly
shouldLoop:
true, // start again as soon as the animation is finished
colors: const [
Colors.green,
Colors.blue,
Colors.pink,
Colors.orange,
Colors.purple
], // manually specify the colors to be used
),
),
GestureDetector(
onTap: () {
tap.onTap();
},
child: Container(
width: 100.0,
height: 100.0,
decoration: BoxDecoration(
color: Colors.greenAccent,
shape: BoxShape.circle,
),
),
),
],
),
));
}
}
class Tap {
GlobalKey<MyAppState> key = GlobalKey<MyAppState>();
onTap() {
key.currentState.controllerTopCenter.play();
}
}
推荐阅读
- javascript - 使用 jQuery 随机引用
- bash - 将局部变量传递给远程 shell bash 脚本
- c# - 数据存储查询数组
- android - android写入共享首选项获取java.io.IOException:写入失败:ENOSPC(设备上没有剩余空间)
- xamarin - Fody.WeavingTask 和 SolutionDir 的 Xamarin 问题
- java - 布尔唯一骰子
- google-sheets - 如何使用 Google 应用脚本在值更改时自动在下方添加边框
- docker - 如何使用 docker 和 deepstream.io 设置项目?
- php - 如果数据库中的数据为空,如何在html表中设置“未找到数据”?
- python - 在熊猫中用两个分隔符将列值拆分为三个