一个小部件子列表中多次使用了全局密钥

时间:2019-08-27 11:14:19

标签: flutter dart bloc

关闭应用程序后,当我尝试再次打开它时, 我收到以下错误,但它仅在iOS平台上有效,Android运行良好。

enter image description here

我环顾四周,有几个SO问题和与此问题有关的问题,但无法解决,我还使用bloc模式来管理状态。

我的GlobalKey<FormState>中有AuthenticateForm

import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:low_code/blocs/authentication/authentication_bloc.dart';
import 'package:low_code/blocs/authentication/authentication_event.dart';
import 'package:low_code/helpers/app_localization/app_localizations.dart';

class AuthenticateForm extends StatefulWidget {
  @override
  _AuthenticateFormState createState() => _AuthenticateFormState();
}

class _AuthenticateFormState extends State<AuthenticateForm> {
  GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  String username;

  String password;

  @override
  Widget build(BuildContext context) {
    AppLocalizations appLocalizations = AppLocalizations.of(context);
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: <Widget>[
          TextFormField(
            onSaved: (String value) => username = value,
            initialValue: 'dms-bpm',
            decoration: InputDecoration(
                labelText: appLocalizations.translate('username')),
            // ignore: missing_return
            validator: (String value) {
              if (value.isEmpty) {
                return 'Please enter your ${appLocalizations.translate('username')}';
              }
            },
          ),
          TextFormField(
            onSaved: (String value) => password = value,
            obscureText: true,
            decoration: InputDecoration(
                labelText: appLocalizations.translate('password')),
            initialValue: 'dms-bpm',
            // ignore: missing_return
            validator: (String value) {
              if (value.isEmpty) {
                return 'Please enter your ${appLocalizations.translate('password')}';
              }
            },
          ),
          RaisedButton(
            shape: RoundedRectangleBorder(
                borderRadius: BorderRadius.all(Radius.circular(15))),
            child: Text(appLocalizations.translate('login')),
            onPressed: () {
              _formKey.currentState.save();
              if (_formKey.currentState.validate()) {
                BlocProvider.of<AuthenticationBloc>(context)
                  ..dispatch(
                      Authenticate(username: username, password: password));
              }
            },
          )
        ],
      ),
    );
  }
}

  

Flutter(频道稳定,v1.7.8 + hotfix.4,在Microsoft Windows [版本10.0.17763.615],语言环境为en-GB)

5 个答案:

答案 0 :(得分:1)

在我的情况下,发生此错误是因为我设置了 initialRoute 属性,而我应该设置 home 属性:

class RouteTestApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Demo',
      //initialRoute: '/', //remove this
      home: FirstScreen(),  //this is the calling screen
      routes: {
        ExtractArgumentsScreen.routeName: (context) => ExtractArgumentsScreen(),
      },
    );
  }
}

答案 1 :(得分:1)

就我而言,我运行 flutter 应用程序而不添加 home: BottomNavBar()。 收到错误后,我添加了 home: BottomNavBar() 并提供了热重载(Command + s)以重现此错误(在一个小部件子列表中多次使用全局键)。 然后我只是重新连接我的目标设备并再次运行,这解决了我的问题。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData(
        brightness:Brightness.light,
        primaryColor: Colors.white,
        accentColor: Colors.blue,
        fontFamily: 'Poppins',
        appBarTheme: AppBarTheme(
          centerTitle: true,
        ),
      ),
      home: BottomNavBar(),
    );
  }
}

答案 2 :(得分:0)

尝试停止并重新运行您的应用程序,而不是热重新加载。这解决了我的问题。

答案 3 :(得分:-1)

尝试使您的 GlobalKey 成为“最终的”。我认为您的全局密钥是可变的这一事实可能会造成这个问题。

答案 4 :(得分:-1)

就我而言,home: 对象的 MaterialApp() 属性中的调用屏幕返回 null。修复后,我停止了应用程序并重新运行。