flutter 最新错误(最新初始化错误:字段“prefs”尚未初始化,)

ldioqlga  于 2023-03-03  发布在  Flutter
关注(0)|答案(2)|浏览(196)

我已经建立了一个安卓应用程序,我想当我再次打开应用程序,它来的最后一个值和状态,我以前做的。这个错误是我运行应用程序后来的。有人可以请提供一个什么样的示例代码需要解决下面的错误?
出现异常。最近错误(最近初始化错误:字段"prefs"尚未初始化。)
这是我的代码:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var dataAddress;
  final _usernameController = TextEditingController();
  final _passwordController = TextEditingController();
  bool isPressed = true;
  var state = FlutterVpnState.disconnected;
  CharonErrorState? charonState = CharonErrorState.NO_ERROR;
  late SharedPreferences prefs;

  @override
  void initState() {
    super.initState();
    initSharedPreferences();
    FlutterVpn.prepare();
    FlutterVpn.onStateChanged.listen((s) => setState(() => state = s));
    SharedPreferences.getInstance().then((value) => prefs = value);
  }

  void initSharedPreferences() async {
    prefs = await SharedPreferences.getInstance();
    String? address = prefs.getString('address');
    String? username = prefs.getString('username');
    String? password = prefs.getString('password');
    dataAddress = address ?? '';
    _usernameController.text = username ?? '';
    _passwordController.text = password ?? '';
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: SafeArea(
          child: Scaffold(
            body: Stack(
              fit: StackFit.expand,
              children: <Widget>[
                ListView(
                  children: <Widget>[
                    StreamBuilder<QuerySnapshot>(
                      stream: FirebaseFirestore.instance.collection('servers').snapshots(includeMetadataChanges: true),
                      builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) {
                        if (snapshot.hasError) {
                          return Text('Something went wrong');
                        }
                        return DropdownSearch<String>(
                              dropdownDecoratorProps: DropDownDecoratorProps(
                                dropdownSearchDecoration: InputDecoration(
                                  labelText: "Server",
                                ),
                              ),
                              dropdownBuilder: ((context, selectedItem) {
                                return Text(
                                  selectedItem ?? ""
                                );
                              }),
                              items: snapshot.data!.docs.map((DocumentSnapshot document) {
                                    Map<String, dynamic> data = document.data()! as Map<String, dynamic>;
                                    return data["address"];
                                  })
                                  .toList().cast<String>(),
                              onChanged: (data) {
                                setState(() {
                                  dataAddress = data;  
                                });
                              },
                              selectedItem: dataAddress,
                            );
                      },
                    ),

                    TextFormField(
                      controller: _usernameController,
                      decoration: InputDecoration(
                        labelText: 'Username',
                      ),
                    ),

                    TextFormField(
                      controller: _passwordController,
                      decoration: InputDecoration(
                        labelText: 'Password'
                      ),
                    ),

                      IconButton(
                        onPressed: () async {
                          if (state == FlutterVpnState.disconnected) {
                            setState(() {
                              isPressed = true;
                            });
                            try {
                              await FlutterVpn.connectIkev2EAP(
                                server: dataAddress,
                                username: _usernameController.text,
                                password: _passwordController.text,
                              );
                              setState(() {
                                isPressed = false;
                              });
                            } catch (e) {
                              setState(() {
                                isPressed = false;
                              });
                            }
                          } else {
                            FlutterVpn.disconnect();
                            setState(() {
                              isPressed = true;
                            });
                          }   
                        },
                        icon: state == FlutterVpnState.connecting || state == FlutterVpnState.disconnecting
                          ? LoadingAnimationWidget.inkDrop(
                            color: Colors.white,
                            size: 100
                          )
                          : state == FlutterVpnState.disconnected
                            ? Image.asset('assets/images/power-on.png')
                            : Image.asset('assets/images/power-off.png')
                      ),      
                    ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

编辑:我尝试了上面的两个解决方案,但在我关闭后,我再次打开应用程序,它没有来到最后的值和状态。

nhn9ugyo

nhn9ugyo1#

由于您仅在函数initSharedPreferences中使用prefs,因此将其设置为局部变量

void initSharedPreferences() async {
    final prefs = await SharedPreferences.getInstance();
    String? address = prefs.getString('address');
    String? username = prefs.getString('username');
    String? password = prefs.getString('password');
    dataAddress = address ?? '';
    _usernameController.text = username ?? '';
    _passwordController.text = password ?? '';
  }

删除以下两行。

late SharedPreferences prefs;

SharedPreferences.getInstance().then((value) => prefs = value);

希望这能帮上忙。

tez616oj

tez616oj2#

    • 原因**:发生这种情况是因为在SharedPreferences.getInstance().then((value) => prefs = value);中使用async函数initSharedPreferences()之前,它不是awaited
late SharedPreferences prefs;

  @override
  void initState() {
    super.initState();
    initSharedPreferences();  // 👈 await is not used , so the async function might be still running in the background where prefs is still not initialized.
    FlutterVpn.prepare();
    FlutterVpn.onStateChanged.listen((s) => setState(() => state = s));
    SharedPreferences.getInstance().then((value) => prefs = value); // You are not sure if the pref is initialized but you are using it anyways
  }

  void initSharedPreferences() async {
    prefs = await SharedPreferences.getInstance();
    String? address = prefs.getString('address');
    String? username = prefs.getString('username');
    String? password = prefs.getString('password');
    dataAddress = address ?? '';
    _usernameController.text = username ?? '';
    _passwordController.text = password ?? '';
  }
    • 解决方案:**

1.从initState()中删除SharedPreferences.getInstance().then((value) => prefs = value);,因为您不能等待initSharedPreferences()函数,因为它是initState()。并将其放入initSharedPreferences()函数中。

late SharedPreferences prefs;

  @override
  void initState() {
    super.initState();
    initSharedPreferences(); 
    FlutterVpn.prepare();
    FlutterVpn.onStateChanged.listen((s) => setState(() => state = s));
   // SharedPreferences.getInstance().then((value) => prefs = value); // 👈 comment out
  }

  void initSharedPreferences() async {
    prefs = await SharedPreferences.getInstance();
    String? address = prefs.getString('address');
    String? username = prefs.getString('username');
    String? password = prefs.getString('password');
    dataAddress = address ?? '';
    _usernameController.text = username ?? '';
    _passwordController.text = password ?? '';
     SharedPreferences.getInstance().then((value) => prefs = value); 👈 add it here
  }

1.您甚至可以在initSharedPreferences()函数中局部使用prefs变量,并避免在函数外部定义它。

// late SharedPreferences prefs;👈 remove this line

  @override
  void initState() {
    super.initState();
    initSharedPreferences(); 
    FlutterVpn.prepare();
    FlutterVpn.onStateChanged.listen((s) => setState(() => state = s));
   // SharedPreferences.getInstance().then((value) => prefs = value);👈 remove this line
  }

  void initSharedPreferences() async {
    SharedPreferences prefs = await SharedPreferences.getInstance(); // 👈 create variable locally
    String? address = prefs.getString('address');
    String? username = prefs.getString('username');
    String? password = prefs.getString('password');
    dataAddress = address ?? '';
    _usernameController.text = username ?? '';
    _passwordController.text = password ?? '';\
  }

相关问题