Raf*_*ino 5 navigator setstate dart flutter
我想在 Navigator.pop 时重新加载我的列表,但我不能这样做。
我的代码:
class ConfigCNPJPage extends StatefulWidget {
bool voltarTela;
ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);
@override
ConfigCNPJPageState createState() => new ConfigCNPJPageState();
}
class ConfigCNPJPageState extends State<ConfigCNPJPage>
with SingleTickerProviderStateMixin {
ResultConfig BD;
List<Map> list;
List<Widget> listArray = [];
Stream myStream;
Future setupList() async {
ConfigDatabase db = ConfigDatabase();
var banco = await db.initDB();
list = await banco.rawQuery('SELECT * FROM Empresa');
return list;
}
@override
void initState() {
super.initState();
myStream = setupList()?.asStream();
}
@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: myStream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return snapshot.hasData? new Scaffold(
resizeToAvoidBottomPadding: false,
appBar: new AppBar(
title: new Text('Configurar Empresa'),
actions: <Widget>[
new IconButton(icon: const Icon(Icons.add), onPressed: () {
Navigator.pushNamed(context, "NovoCNPJ").then((value) {
setState(() {
myStream = setupList()?.asStream();
});
});
})
],
),
body: new Column(
children: <Widget>[
criarLista()
],
),
):new Center(child: new RefreshProgressIndicator());
},);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在弹出后使用 setState 重新加载此 Stream,但不起作用。任何人都可以帮忙吗?
我需要重建那个StreamBuilder?还是只重新加载列表?
使用StreamBuilder,我需要执行setState,如果我重建了streamBuilder,它会起作用吗?
我想在该示例中您必须使用 aStreamController而不是 a Stream。
从您的示例中,查看_streamController出现的情况。
class ConfigCNPJPage extends StatefulWidget {
bool voltarTela;
ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);
@override
ConfigCNPJPageState createState() => new ConfigCNPJPageState();
}
class ConfigCNPJPageState extends State<ConfigCNPJPage>
with SingleTickerProviderStateMixin {
ResultConfig BD;
List<Map> list;
List<Widget> listArray = [];
StreamController _streamController;
Future setupList() async {
ConfigDatabase db = ConfigDatabase();
var banco = await db.initDB();
list = await banco.rawQuery('SELECT * FROM Empresa');
return list;
}
@override
void initState() {
super.initState();
_streamController = new StreamController();
setupList()?.then((o) => _streamController.add(o));
}
@override
Widget build(BuildContext context) {
return new StreamBuilder(
stream: _streamController.stream,
builder: (BuildContext context, AsyncSnapshot snapshot) {
return snapshot.hasData? new Scaffold(
resizeToAvoidBottomPadding: false,
appBar: new AppBar(
title: new Text('Configurar Empresa'),
actions: <Widget>[
new IconButton(icon: const Icon(Icons.add), onPressed: () {
Navigator.pushNamed(context, "NovoCNPJ").then((value) {
setState(() {
_streamController.add(value);
});
});
})
],
),
body: new Column(
children: <Widget>[
criarLista()
],
),
):new Center(child: new RefreshProgressIndicator());
},);
}
}
Run Code Online (Sandbox Code Playgroud)
但在您的用例中,您是否只有一家企业/公司,还是有很多?
如果您只有一个,而不是拥有一个Stream,那么管理一个_empresa/_company对象会更容易。
如果您希望有一个对象列表,那么我StreamBuilder也不会使用 a 。我也会管理List<Empresa> _empresas。
class ConfigCNPJPage extends StatefulWidget {
bool voltarTela;
ConfigCNPJPage({Key key, this.voltarTela}) : super(key: key);
@override
ConfigCNPJPageState createState() => new ConfigCNPJPageState();
}
class ConfigCNPJPageState extends State<ConfigCNPJPage>
with SingleTickerProviderStateMixin {
ResultConfig BD;
List<Map> list;
List<Widget> listArray = [];
List<Empresa> _empresas;
Future setupList() async {
ConfigDatabase db = ConfigDatabase();
var banco = await db.initDB();
list = await banco.rawQuery('SELECT * FROM Empresa');
return list;
}
@override
void initState() {
super.initState();
setupList()?.then((o) {
if (_empresas == null) _empresas = new List();
// if o is a list, perform a forEach on it
_empresas.add(new Empresa(o))
});
}
@override
Widget build(BuildContext context) {
// o melhor seria usar outra variavel pra controlar o loading,
// mas deve funcionar assim
return _empresas == null
? new Center(child: new RefreshProgressIndicator())
: new Scaffold(
resizeToAvoidBottomPadding: false,
appBar: new AppBar(
title: new Text('Configurar Empresa'),
actions: <Widget>[
new IconButton(icon: const Icon(Icons.add), onPressed: () {
Navigator.pushNamed(context, "NovoCNPJ").then((value) {
setState(() {
_empresas.add(new Empresa(value));
});
});
})
],
),
body: new Column(
children: <Widget>[
criarLista()
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
祝你好运!