我目前在使用共享首選項編程我的設定頁面時遇到問題。我目前有 3 個檔案和 3 個我研究過的錯誤,但不知道如何修復。
第 157 行(main.Dart)的錯誤說:
沒有為“設定”型別定義方法“setState”。嘗試將名稱更正為現有方法的名稱,或定義名為 'setState'.dartundefined_method 的方法
第 169 行(main.dart)的錯誤說:
方法“initState”未在“設定”的超類中定義。嘗試將名稱更正為現有方法的名稱,或在 superclass.dartundefined_super_member 中定義名為“initState”的方法
第 20 行 (shared_preferences.dart) 的錯誤說:
引數型別“字串?” 不能分配給引數型別“字串”。dartargument_type_not_assignable
我是 Flutter 的新手,所以我一直在關注教程并購買了幾門課程,但我什至不知道如何開始修復這些錯誤,所以任何幫助將不勝感激,因為 Stack Overflow 總是很棒!謝謝!
main.dart(第 149 - 240 行)
// Settings Page & Account Information
class Settings extends StatelessWidget {
Settings({Key? key}) : super(key: key);
final _preferencesService = PreferencesService();
final _usernameController = TextEditingController();
void _populateFields() async {
final settings = await _preferencesService.getSettings();
setState(() { // Line 157 Issue
_usernameController.text = settings.username;
});
}
@override
Widget build(BuildContext context) {
final theme = MediaQuery.of(context).platformBrightness == Brightness.dark
? 'DarkTheme'
: 'LightTheme';
void initState() {
super.initState(); // Line 169 Issue
_populateFields();
}
return Scaffold(
appBar: AppBar(
title: const Text(
'Settings'), /* actions: <Widget>[
IconButton(
onPressed: () async {
_saveSettings;
},
icon: const Icon(Icons.save),
tooltip: 'Save Settings')
] */
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.fromLTRB(8, 8, 8, 8),
child: Column(
children: [
Column(
// Account
children: [
const Padding(
padding: EdgeInsets.fromLTRB(0, 12, 0, 0),
child: Text('Account Information',
style: TextStyle(
fontSize: 17.0,
))),
Padding(
padding: const EdgeInsets.fromLTRB(12, 0, 12, 12),
child: TextField(
controller: _usernameController,
inputFormatters: [LengthLimitingTextInputFormatter(25)],
decoration: InputDecoration(
hintText: 'Username',
labelText: 'Username',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10.0)),
),
),
),
],
),
Container(
child: Column(
// App Settings
children: [
// SwitchListTile(value: DarkMode, onChanged: Light => Dark => Light)
// ChangeThemeButtonWidget(),
TextButton(
onPressed: _saveSettings,
child: const Text('Save Settings'))
],
),
),
],
),
)));
}
void _saveSettings() {
final newSettings = SettingsModal(
username: _usernameController.text,
);
print(newSettings);
print(_usernameController.text);
_preferencesService.saveSettings(newSettings);
}
}
shared_preferences.dart
import 'package:bit/main.dart';
import 'package:bit/saved_data.dart';
import 'package:shared_preferences/shared_preferences.dart';
class PreferencesService {
Future saveSettings(SettingsModal settings) async {
final preferences = await SharedPreferences.getInstance();
await preferences.setString('username', settings.username);
print('Saved Settings');
}
Future<SettingsModal> getSettings() async {
final preferences = await SharedPreferences.getInstance();
final username = preferences.getString('username');
return SettingsModal(
username: username, // Line 20 Issue
);
}
}
保存資料.dart
import 'package:shared_preferences/shared_preferences.dart';
import 'package:bit/main.dart';
class SettingsModal {
final String username;
SettingsModal({
required this.username,
});
}
uj5u.com熱心網友回復:
我建議您閱讀以下內容:https ://docs.flutter.dev/development/ui/interactive 。
但是,回答你的問題:
第 157 行錯誤:您的 Settings 類是一個無狀態小部件,因此..您不能為該小部件設定任何狀態,因為它沒有狀態。如果要添加狀態,則需要將 Settings 設定為 Stateful Widget。
第 169 行的錯誤:由于您的 Settings 類從 Stateless 小部件擴展而來,因此它的 super 也沒有 initState 方法。同樣,您應該使您的 Settings 類成為有狀態的小部件。
sharedpreferences中的錯誤:getString方法可以為null,所以它的型別是String,同時需要用戶名,所以你有以下選擇:
選項 1:
final username = preferences.getString('username')!;
選項 2:
final username = preferences.getString('username') ?? "";
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430631.html
