正如標題所提到的,我目前正在創建一個吉他應用程式,其中包含有關基本音符和和弦、和弦生成器以及吉他調音器的一些資訊。我決定從我認為最難的部分開始,不幸的是幾乎沒有進展。
我想包含一個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")),
],
),
);
}
}
這是我的 tuner.dart,對于像 flutterFft.onRecorderStateChange.listen 這樣的東西,它需要是有狀態的
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))
},
one rror: (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....**
我在網上環顧四周,似乎找不到任何適合這個問題的東西,但也許我看到它時不知道答案......
如果需要更多資訊,請告訴我,但希望我已經在此處提供了所有資訊。我對 Flutter 很陌生,但了解大多數其他典型語言,即 Java、JS、Python、HTML 等。
提前致謝,非常感謝任何幫助,或者任何關于更好方法的建議也肯定會有所幫助:)
uj5u.com熱心網友回復:
例如,在您的 tuner.dart 檔案中_TurnerState extends the Sate<Home>,它需要擴展class _TunerState extends State<Turner>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/398938.html
上一篇:文本在不同模擬器上的大小不同
下一篇:如何重新定位資源目錄?
