при использовании 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

Нет, это так не работает.

  1. final это тоже самое что и const только вычисляется после присваивания в runtime.
  2. Вы передаете объект в другой класс, но не его логику.
  3. Вы можете использовать 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]}');
          },
        ),
      ),
    );
  }
}
→ Ссылка