正如标题所提到的,我目前正在创建一个吉他应用程序,它包括一些关于基本音符和和弦的信息,一个和弦生成器,当然还有一个吉他调谐器。我决定从我认为最困难的部分开始,不幸的是没有什么进展。
我想包括一个BottomNavigationBar来在这三个工具之间导航,每个工具占用一个页面。我可以在使用StatelessWidget,时使导航工作,但是一旦我开始使用_TunerState进行记录,我就开始接收错误。
我已经成功地让这个工具在单独的应用程序中工作,只使用main.dart,但是将该解决方案集成到我的项目中是很困难的。
我打算做的是使用_TunerState类初始化和启动flutter_fft记录器,它将侦听麦克风输入和输出信息中的变化,如频率、注释等。
下面的是我的home_widget.dart,负责导航,或者至少这就是我想用它做的事情,
class Home extends StatefulWidget {
const Home({Key? key}) : super(key: key);
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State {
int currentTab = 0;
late Widget currentPage;
late Fretboard fretboard;
late ChordGen chordGen;
late Tuner tuner;
late List<Widget> pages;
@override
void initState() {
fretboard = Fretboard();
chordGen = ChordGen();
tuner = Tuner();
pages = [fretboard, chordGen, tuner];
currentPage = fretboard;
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
systemOverlayStyle: SystemUiOverlayStyle(statusBarColor: Colors.transparent),
toolbarHeight: -24,
),
body: currentPage,
bottomNavigationBar: BottomNavigationBar(
currentIndex: currentTab,
onTap: (int index) {
setState(() {
currentTab = index;
currentPage = pages[index];
});
},
items: <BottomNavigationBarItem>[
BottomNavigationBarItem(
icon: Icon(GuitarIcons.two_music_notes, size: 30),
title: Text("Fretboard")),
BottomNavigationBarItem(
icon: Icon(GuitarIcons.generator, size: 30),
title: Text("Generator")),
BottomNavigationBarItem(
icon: Icon(GuitarIcons.sound_bars, size: 30),
title: Text("Tuner")),
],
),
);
}
}
这是我的flutterFft.onRecorderStateChange.listen,这是我的tuner.dart,它需要对像这样的东西是重要的。
class Tuner extends StatefulWidget {
@override
_TunerState createState() => _TunerState();
}
class _TunerState extends State<Home> {
double? frequency;
String? note;
int? octave;
bool? isRecording;
FlutterFft flutterFft = FlutterFft();
_initialize() async {
print("Starting recorder...");
// print("Before");
// bool hasPermission = await flutterFft.checkPermission();
// print("After: " + hasPermission.toString());
// Keep asking for mic permission until accepted
while (!(await flutterFft.checkPermission())) {
flutterFft.requestPermission();
// IF DENY QUIT PROGRAM
}
// await flutterFft.checkPermissions();
await flutterFft.startRecorder();
print("Recorder started...");
setState(() => isRecording = flutterFft.getIsRecording);
flutterFft.onRecorderStateChanged.listen(
(data) => {
print("Changed state, received: $data"),
setState(
() => {
frequency = data[1] as double,
note = data[2] as String,
octave = data[5] as int,
},
),
flutterFft.setNote = note!,
flutterFft.setFrequency = frequency!,
flutterFft.setOctave = octave!,
print("Octave: ${octave!.toString()}"),
sleep(const Duration(milliseconds: 100))
},
onError: (err) {
print("Error: $err");
},
onDone: () => {print("Isdone")});
}
@override
void initState() {
isRecording = flutterFft.getIsRecording;
frequency = flutterFft.getFrequency;
note = flutterFft.getNearestNote;
octave = flutterFft.getOctave;
super.initState();
_initialize();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Simple flutter fft example",
theme: ThemeData.dark(),
color: Colors.blue,
home: Scaffold(
backgroundColor: Colors.purple,
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
isRecording!
? Text("Current note: ${note!}",
style: TextStyle(fontSize: 30))
: Text("Not Recording", style: TextStyle(fontSize: 35)),
isRecording!
? Text(
"Current frequency: ${frequency!.toStringAsFixed(2)}",
style: TextStyle(fontSize: 30))
: Text("Not Recording", style: TextStyle(fontSize: 35))
],
),
),
));
}
}
因此,当我试图在Android仿真程序上运行应用程序时,我会收到以下错误消息:。
======== Exception caught by widgets library =======================================================
The following assertion was thrown building _BodyBuilder:
StatefulWidget.createState must return a subtype of State<Tuner>
The createState function for Tuner returned a state of type _TunerState, which is not a
subtype of State<Tuner>, violating the contract for createState.
The relevant error-causing widget was:
Scaffold Scaffold:file:///C:.../guitar_app/lib/home_widget.dart:42:12
When the exception was thrown, this was the stack:
**followed by nearly 200 lines of error code....**
我在网上环顾了一下,似乎找不到任何适合这个问题的东西,但也许我只是不知道我看到它时的答案.
如果需要更多的信息,请告诉我,但希望我已经包括了这里的一切。我对其他大多数典型的语言都很熟悉,比如Java、JS、Python、HTML等等。
预先感谢,任何帮助都是非常感谢的,或者任何关于更好的方法的建议肯定也是有帮助的:)
发布于 2021-12-29 21:41:27
在您的tuner.dart文件中,_TurnerState extends the Sate<Home>
,但是它需要扩展,例如class _TunerState extends State<Turner>
。
https://stackoverflow.com/questions/70525236
复制相似问题