Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android TextEditingController使小部件失去以前的状态_Android_Ios_Dart_Flutter - Fatal编程技术网

Android TextEditingController使小部件失去以前的状态

Android TextEditingController使小部件失去以前的状态,android,ios,dart,flutter,Android,Ios,Dart,Flutter,当我在CupertinoTextField中使用TextEditingController并切换到另一个小部件(页面)并返回时,该页面中的先前状态将丢失 当我取消注释//controller:textController时,一切正常 import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; void main() => runApp(new MyApp()); class MyApp

当我在
CupertinoTextField
中使用
TextEditingController
并切换到另一个小部件(页面)并返回时,该页面中的先前状态将丢失

当我取消注释
//controller:textController时,
一切正常

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
            body: TabBarView(
              children: [new Search(), new Setting(),
              ],
            ),
            bottomNavigationBar: Container(
              height: 60,
              child: new TabBar(
                tabs: [
                  Tab(icon: new Icon(Icons.search)),
                  Tab(icon: new Icon(Icons.settings)),
                ],
                labelColor: Colors.blue,
                unselectedLabelColor: Colors.grey,
              ),
            )
        ),
      ),
    );
  }
}

class Setting extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconButton(
        icon: Icon(Icons.check),
        onPressed: () {
          Navigator.push(context, CupertinoPageRoute(
              builder: (context) =>
              new Scaffold(
                appBar: AppBar(title: Text('3'),),
              )));
        });
  }

}

class Search extends StatefulWidget {
  @override
  createState() => new SearchState();
}

class SearchState extends State<Search> {

  String currentWord = '';
  final TextEditingController textController = new TextEditingController();

  @override
  void dispose() {
    textController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: new AppBar(
          title: new Row(
            children: <Widget>[
              new Expanded(
                child: new CupertinoTextField(
                  style: TextStyle(color: Colors.white),
                  cursorColor: Colors.white,
                  //controller: textController,
                  maxLines: 1,
                  clearButtonMode: OverlayVisibilityMode.editing,
                  onChanged: (text) {
                    setState(() {
                      currentWord = text;
                    });
                  },
                ),
              ),
            ],
          ),
        ),
        body: ListView.builder(
            itemCount: 5,
            itemBuilder: (context, i) {
              return Text(currentWord);
            })
    );
  }

}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:"测试",,
主页:DefaultTabController(
长度:2,
孩子:脚手架(
正文:选项卡视图(
子项:[新搜索(),新设置(),
],
),
底部导航栏:容器(
身高:60,
孩子:新的TabBar(
选项卡:[
选项卡(图标:新图标(Icons.search)),
选项卡(图标:新图标(图标.设置)),
],
labelColor:Colors.blue,
未选择的标签颜色:Colors.grey,
),
)
),
),
);
}
}
类设置扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回图标按钮(
图标:图标(图标。检查),
已按下:(){
Navigator.push(上下文,CupertinoPageRoute(
生成器:(上下文)=>
新脚手架(
appBar:appBar(标题:文本('3'),),
)));
});
}
}
类搜索扩展了StatefulWidget{
@凌驾
createState()=>新建SearchState();
}
类SearchState扩展状态{
字符串currentWord=“”;
最终文本编辑控制器文本控制器=新文本编辑控制器();
@凌驾
无效处置(){
textController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
归还新脚手架(
appBar:新的appBar(
标题:新行(
儿童:[
新扩展(
孩子:新的CupertinoTextField(
样式:TextStyle(颜色:Colors.white),
光标颜色:颜色。白色,
//控制器:textController,
maxLines:1,
clearButtonMode:OverlyVisibilityMode.editing,
一旦更改:(文本){
设置状态(){
currentWord=文本;
});
},
),
),
],
),
),
正文:ListView.builder(
物品计数:5,
itemBuilder:(上下文,i){
返回文本(currentWord);
})
);
}
}
预期结果(未设置控制器):返回,状态保持不变

实际结果(已设置控制器):返回,状态丢失


观察到的行为解释如下:

CupertinoTextField
使用内部
TextEditingController
,框架会自动为其设置
AutomaticKeepAlive
。这个keepAlive负责维护国家

如果您使用自己的控制器,您将负责附加
automatickepalive
,因为框架不适合您

以下代码段将keepAlive添加到代码中:

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'test',
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
            body: TabBarView(
              children: [
                new Search(),
                new Setting(),
              ],
            ),
            bottomNavigationBar: Container(
              height: 60,
              child: new TabBar(
                tabs: [
                  Tab(icon: new Icon(Icons.search)),
                  Tab(icon: new Icon(Icons.settings)),
                ],
                labelColor: Colors.blue,
                unselectedLabelColor: Colors.grey,
              ),
            )),
      ),
    );
  }
}

class Setting extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return IconButton(
        icon: Icon(Icons.check),
        onPressed: () {
          Navigator.push(
              context,
              CupertinoPageRoute(
                  builder: (context) => new Scaffold(
                        appBar: AppBar(
                          title: Text('3'),
                        ),
                      )));
        });
  }
}

class Search extends StatefulWidget {
  @override
  createState() => new SearchState();
}

class SearchState extends State<Search> with AutomaticKeepAliveClientMixin {
  String currentWord = '';
  final TextEditingController textController = new TextEditingController();

  @override
  void initState() {
    super.initState();
    textController?.addListener(updateKeepAlive);
  }

  @override
  void dispose() {
    textController?.removeListener(updateKeepAlive);
    textController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context); // See AutomaticKeepAliveClientMixin.
    return new Scaffold(
        appBar: new AppBar(
          title: new Row(
            children: <Widget>[
              new Expanded(
                child: new CupertinoTextField(
                  style: TextStyle(color: Colors.white),
                  cursorColor: Colors.white,
                  controller: textController,
                  maxLines: 1,
                  clearButtonMode: OverlayVisibilityMode.editing,
                  onChanged: (text) {
                    setState(() {
                      currentWord = text;
                    });
                  },
                ),
              ),
            ],
          ),
        ),
        body: ListView.builder(
            itemCount: 5,
            itemBuilder: (context, i) {
              return Text(currentWord);
            }));
  }

  @override
  bool get wantKeepAlive => textController?.text?.isNotEmpty == true;
}
import'包装:flift/cupertino.dart';
进口“包装:颤振/材料.省道”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:"测试",,
主页:DefaultTabController(
长度:2,
孩子:脚手架(
正文:选项卡视图(
儿童:[
新建搜索(),
新设置(),
],
),
底部导航栏:容器(
身高:60,
孩子:新的TabBar(
选项卡:[
选项卡(图标:新图标(Icons.search)),
选项卡(图标:新图标(图标.设置)),
],
labelColor:Colors.blue,
未选择的标签颜色:Colors.grey,
),
)),
),
);
}
}
类设置扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回图标按钮(
图标:图标(图标。检查),
已按下:(){
导航器。推(
上下文
CupertinoPageRoute(
生成器:(上下文)=>新脚手架(
appBar:appBar(
标题:文本(“3”),
),
)));
});
}
}
类搜索扩展了StatefulWidget{
@凌驾
createState()=>新建SearchState();
}
类SearchState使用AutomaticEpaLiveClientMixin扩展状态{
字符串currentWord=“”;
最终文本编辑控制器文本控制器=新文本编辑控制器();
@凌驾
void initState(){
super.initState();
textController?.addListener(updateKeepAlive);
}
@凌驾
无效处置(){
textController?.removeListener(updateKeepAlive);
textController.dispose();
super.dispose();
}
@凌驾
小部件构建(构建上下文){
super.build(context);//请参阅AutomaticEpaLiveClientMixin。
归还新脚手架(
appBar:新的appBar(
标题:新行(
儿童:[
新扩展(
孩子:新的CupertinoTextField(
样式:TextStyle(颜色:Colors.white),
光标颜色:颜色。白色,
控制器:textController,
maxLines:1,
clearButtonMode:OverlyVisibilityMode.editing,
一旦更改:(文本){
设置状态(){
currentWord=文本;
});
},