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=文本;
});
},