Flutter &引用'_listenerAttached';:“这不是真的”;在StatefulWidget中更改布局之后

Flutter &引用'_listenerAttached';:“这不是真的”;在StatefulWidget中更改布局之后,flutter,Flutter,我正试图根据一些TextFormField的焦点状态更改颤振屏幕的布局 我在以下代码中遇到问题: 当我聚焦触发布局更改的文本字段之一时,键盘隐藏 聚焦另一个文本字段时,我得到一个错误: 在生成\u ScrollableScope时抛出以下断言: “package:flatter/src/rendering/editable.dart”:失败的断言:第590行位置14: “_listenerAttached”:不正确。 我错过了什么 import 'package:flutter/mater

我正试图根据一些
TextFormField
的焦点状态更改颤振屏幕的布局

我在以下代码中遇到问题:

  • 当我聚焦触发布局更改的文本字段之一时,键盘隐藏
  • 聚焦另一个文本字段时,我得到一个错误:
在生成\u ScrollableScope时抛出以下断言:
“package:flatter/src/rendering/editable.dart”:失败的断言:第590行位置14:
“_listenerAttached”:不正确。
我错过了什么

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
          body: MyHomePage(),
        ));
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isCollapsed;

  FocusNode _focusOne = FocusNode();
  FocusNode _focusTwo = FocusNode();

  TextEditingController _controllerOne = TextEditingController();
  TextEditingController _controllerTwo = TextEditingController();

  @override
  void initState() {
    super.initState();
    _isCollapsed = false;

    _focusOne.addListener(_onFocusChange);
    _focusTwo.addListener(_onFocusChange);
  }

  @override
  Widget build(BuildContext context) {
    if (!_isCollapsed) {
      return Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("Title"),
            TextFormField(
              focusNode: _focusOne,
              controller: _controllerOne,
            ),
            TextFormField(focusNode: _focusTwo, controller: _controllerTwo)
          ],
        ),
      );
    } else {
      return Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          TextFormField(
            focusNode: _focusOne,
            controller: _controllerOne,
          ),
          TextFormField(focusNode: _focusTwo, controller: _controllerTwo)
        ],
      );
    }
  }

  void _onFocusChange() {
    setState(() {
      if (_focusOne.hasFocus || _focusTwo.hasFocus) {
        _isCollapsed = true;
      } else {
        _isCollapsed = false;
      }
    });
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
正文:MyHomePage(),
));
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
布尔!;
FocusNode_focusOne=FocusNode();
FocusNode_focusTwo=FocusNode();
TextEditingController _controllerOne=TextEditingController();
TextEditingController_controllerTwo=TextEditingController();
@凌驾
void initState(){
super.initState();
_isCollapsed=false;
_addListener(_onFocusChange);
_focusTwo.addListener(_onFocusChange);
}
@凌驾
小部件构建(构建上下文){
如果(!\u已合并){
返回中心(
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
正文(“标题”),
TextFormField(
focusNode:_focusOne,
控制员:_控制员,
),
TextFormField(focusNode:\u focusTwo,controller:\u controllerTwo)
],
),
);
}否则{
返回列(
mainAxisSize:mainAxisSize.min,
儿童:[
TextFormField(
focusNode:_focusOne,
控制员:_控制员,
),
TextFormField(focusNode:\u focusTwo,controller:\u controllerTwo)
],
);
}
}
void _onFocusChange(){
设置状态(){
if(_focusOne.hasFocus | | u focusTwo.hasFocus){
_isCollapsed=true;
}否则{
_isCollapsed=false;
}
});
}
}

似乎需要
字段来跟踪布局更改之间的TextFormField。
以下是一个可行的解决方案:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
          body: MyHomePage(),
        ));
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isCollapsed;

  FocusNode _focusOne = FocusNode();
  FocusNode _focusTwo = FocusNode();

  TextEditingController _controllerOne = TextEditingController();
  TextEditingController _controllerTwo = TextEditingController();

  final GlobalKey<FormState> _formKeyOne = GlobalKey<FormState>();
  final GlobalKey<FormState> _formKeyTwo = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
    _isCollapsed = false;

    _focusOne.addListener(_onFocusChange);
    _focusTwo.addListener(_onFocusChange);
  }

  @override
  Widget build(BuildContext context) {
    if (!_isCollapsed) {
      return Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("Title"),
            TextFormField(
              key: _formKeyOne,
              focusNode: _focusOne,
              controller: _controllerOne,
            ),
            TextFormField(
              key: _formKeyTwo,
              focusNode: _focusTwo, 
            controller: _controllerTwo)
          ],
        ),
      );
    } else {
      return Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          TextFormField(
            key: _formKeyOne,
            focusNode: _focusOne,
            controller: _controllerOne,
          ),
          TextFormField(
            key: _formKeyTwo,
            focusNode: _focusTwo, 
          controller: _controllerTwo)
        ],
      );
    }
  }

  void _onFocusChange() {
    setState(() {
      if (_focusOne.hasFocus || _focusTwo.hasFocus) {
        _isCollapsed = true;
      } else {
        _isCollapsed = false;
      }
    });
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
正文:MyHomePage(),
));
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
布尔!;
FocusNode_focusOne=FocusNode();
FocusNode_focusTwo=FocusNode();
TextEditingController _controllerOne=TextEditingController();
TextEditingController_controllerTwo=TextEditingController();
最终的GlobalKey _formKeyOne=GlobalKey();
最终的GlobalKey _formKeyTwo=GlobalKey();
@凌驾
void initState(){
super.initState();
_isCollapsed=false;
_addListener(_onFocusChange);
_focusTwo.addListener(_onFocusChange);
}
@凌驾
小部件构建(构建上下文){
如果(!\u已合并){
返回中心(
子:列(
mainAxisSize:mainAxisSize.min,
儿童:[
正文(“标题”),
TextFormField(
钥匙:_formKeyOne,
focusNode:_focusOne,
控制员:_控制员,
),
TextFormField(
键:_formKeyTwo,
focusNode:_focusTwo,
控制器:_controllerTwo)
],
),
);
}否则{
返回列(
mainAxisSize:mainAxisSize.min,
儿童:[
TextFormField(
钥匙:_formKeyOne,
focusNode:_focusOne,
控制员:_控制员,
),
TextFormField(
键:_formKeyTwo,
focusNode:_focusTwo,
控制器:_controllerTwo)
],
);
}
}
void _onFocusChange(){
设置状态(){
if(_focusOne.hasFocus | | u focusTwo.hasFocus){
_isCollapsed=true;
}否则{
_isCollapsed=false;
}
});
}
}

似乎需要
字段来跟踪布局更改之间的TextFormField。
以下是一个可行的解决方案:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
        ),
        home: Scaffold(
          body: MyHomePage(),
        ));
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  bool _isCollapsed;

  FocusNode _focusOne = FocusNode();
  FocusNode _focusTwo = FocusNode();

  TextEditingController _controllerOne = TextEditingController();
  TextEditingController _controllerTwo = TextEditingController();

  final GlobalKey<FormState> _formKeyOne = GlobalKey<FormState>();
  final GlobalKey<FormState> _formKeyTwo = GlobalKey<FormState>();

  @override
  void initState() {
    super.initState();
    _isCollapsed = false;

    _focusOne.addListener(_onFocusChange);
    _focusTwo.addListener(_onFocusChange);
  }

  @override
  Widget build(BuildContext context) {
    if (!_isCollapsed) {
      return Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            Text("Title"),
            TextFormField(
              key: _formKeyOne,
              focusNode: _focusOne,
              controller: _controllerOne,
            ),
            TextFormField(
              key: _formKeyTwo,
              focusNode: _focusTwo, 
            controller: _controllerTwo)
          ],
        ),
      );
    } else {
      return Column(
        mainAxisSize: MainAxisSize.min,
        children: <Widget>[
          TextFormField(
            key: _formKeyOne,
            focusNode: _focusOne,
            controller: _controllerOne,
          ),
          TextFormField(
            key: _formKeyTwo,
            focusNode: _focusTwo, 
          controller: _controllerTwo)
        ],
      );
    }
  }

  void _onFocusChange() {
    setState(() {
      if (_focusOne.hasFocus || _focusTwo.hasFocus) {
        _isCollapsed = true;
      } else {
        _isCollapsed = false;
      }
    });
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
//此小部件是应用程序的根。
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:“颤振演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
家:脚手架(
正文:MyHomePage(),
));
}
}
类MyHomePage扩展StatefulWidget{
@凌驾
_MyHomePageState createState()=>\u MyHomePageState();
}
类_MyHomePageState扩展状态{
布尔!;
FocusNode_focusOne=FocusNode();
FocusNode_focusTwo=FocusNode();
TextEditingController _controllerOne=TextEditingController();
TextEditingController_controllerTwo=TextEditingController();
最终的GlobalKey _formKeyOne=GlobalKey();
最终的GlobalKey _formKeyTwo=GlobalKey();
@凌驾
void initState(){
超级