при использовании navigator.push не меняется состояние индекса
допустим есть первый экран с List<int> list= [1,2];
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:swcouriers/screens/collector_orders/inlist.dart';
class Lsit extends StatefulWidget {
@override
_LsitState createState() => _LsitState();
}
class _LsitState extends State<Lsit> {
List<int> list = [1, 2];
@override
void initState() {
super.initState();
Timer.periodic(Duration(seconds: 1), (timer) {
setState(() {
list[0]++;
});
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView.builder(
itemCount: list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('${list[index]}'),
onTap: () {
Navigator.push(
context, MaterialPageRoute(builder: (context) => InList(
i: list[index]
)));
},
);
},
),
);
}
}
есть второй экран при нажатии на ListTile передается index List<int> list:
import 'package:flutter/material.dart';
class InList extends StatefulWidget {
final int i;
InList({@required this.i});
@override
_InListState createState() => _InListState();
}
class _InListState extends State<InList> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('${widget.i}'),
),
);
}
}
если на первом экране меняется состояние List<int> list, но пользователь находится на втором экране почему не меняется данные индекса на втором экране, и как менять его?
на первом экране, скажем, поменялся индекс 1:
@override
void initState() {
super.initState();
Timer.periodic(Duration(seconds: 1), (timer) {
setState(() {
list[0]++;
});
});
}
Ответы (1 шт):
Автор решения: MiT
→ Ссылка
Нет, это так не работает.
finalэто тоже самое что иconstтолько вычисляется после присваивания вruntime.- Вы передаете объект в другой класс, но не его логику.
- Вы можете использовать VoidCallback для выполнении функции на предыдущим экране, но в обратную сторону это не работает.
WebSocket:
class WebSockets {
static final WebSockets _singleton = WebSockets._internal();
factory WebSockets() => _singleton;
WebSockets._internal();
static var channel = IOWebSocketChannel.connect('ws://echo.websocket.org');
}
class Lsit extends StatefulWidget {
@override
_LsitState createState() => _LsitState();
}
class _LsitState extends State<Lsit> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: StreamBuilder(
stream: WebSockets.channel.stream,
builder: (context, snapshot) {
if (!snapshot.hasData)
return Text('No data');
else
return ListView.builder(
itemCount: snapshot.data.list.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('${snapshot.data.list[index]}'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => InList(
index: index,
)));
},
);
},
);
},
),
);
}
}
class InList extends StatefulWidget {
final int index;
InList({@required this.index});
@override
_InListState createState() => _InListState();
}
class _InListState extends State<InList> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: StreamBuilder(
stream: WebSockets.channel.stream,
builder: (context, snapshot) {
if (!snapshot.hasData)
return Text('No data');
else
return Text('${snapshot.data.list[widget.index]}');
},
),
),
);
}
}