Передача данных между страницами с нижней панелью навигации в флаттере

Не нужно хранить команды в переменных, даже если вам нужно использовать их позже. просто выполните его как обычно. Если вы храните переменную, вам понадобится какой-то оператор eval или вызвать ненужный процесс оболочки для «выполнения вашей переменной».

6
задан DanT29 23 January 2019 в 04:25
поделиться

1 ответ

В вашем коде есть две проблемы:

  1. с использованием асинхронного метода в теле initState(), см. здесь , подробнее

  2. Использование данных экземпляра в инициализаторе см. В здесь для подробностей.

. Ниже приведено очень простое переписывание вашего кода с минимальными исправлениями. [ 1115]

Карта данных загружается из поддельного бэкэнда, обновляется внутри PageOne и выводится на консоль в PageTwo обратного вызова onTap.

Обратите внимание, что я изменил переменную экземпляра Data на data, чтобы соответствовать рекомендациям Effective Dart .

Обратите внимание, что суть неправильно обращается к синхронизации серверной службы с общими предпочтениями: это то, что, вероятно, следует учитывать в конечном продукте.

Я только что прокомментировал, что необходимо для того, чтобы ваш код работал: если сложность вашей системы и отношения с внешним API начинают расти, возможно, стоит рассмотреть архитектуру Bloc.

import 'package:flutter/material.dart';

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

// Mock up of an async backend service
Future<Map<String, dynamic>> getData() async {
  return Future.delayed(Duration(seconds: 1), () => {'prop1': 'value1'});
}

class PageOne extends StatelessWidget {
  final Map<String, dynamic> data;

  PageOne({Key key, this.data}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: RaisedButton(
        child: const Text('update preferences'),
        onPressed: () {
          data['prop2'] = 'value2';
        },
      ),
    );
  }
}

class PageTwo extends StatelessWidget {

  final Map<String, dynamic> data;

  PageTwo({Key key, this.data}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Center(
      child: RaisedButton(
        child: const Text('Got It!'),
        onPressed: () {
          print("data is now: [$data]");
        },
      ),
    );
  }
}

class MainApp extends StatefulWidget {
  @override
  _MainAppState createState() => _MainAppState();
}

class _MainAppState extends State<MainApp> {
  //Map<String, dynamic> Data;
  Map<String, dynamic> data;

  /*
  StartFunc() async {
    Data = await getData();
    setState(() {});
  }
  */

  @override
  void initState() {
    //StartFunc();
    super.initState();
    getData().then((values) {
      setState(() {
        data = values;
      });
    });
  }

  /*
  PageOne(data:data) is an invalid value for an initializer:
   there is no way to access this at this point.
    Initializers are executed before the constructor,
    but this is only allowed to be accessed after the call
    to the super constructor.

  */
  /*
  var _pages = [
    PageOne(data:data),
    PageTwo(),
  ];
  */

  Widget getPage(int index) {
    if (index == 0) {
      return PageOne(data:data);
    }
    if (index == 1) {
      return PageTwo(data:data);
    }
    // A fallback, in this case just PageOne
    return PageOne();
  }

  int _currentIndex = 0;

  onTabTapped(int index) {
    setState(() {
      _currentIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    /*
    return _currentIndex == 2
        ? PageTwo()
        : Scaffold(

    I use a MaterialApp because of material widgets (RaisedButton)
    It is not mandatory, but it is mainstream in flutter

     */
    return MaterialApp(
        title: 'My App',
        home: Scaffold(
          appBar: AppBar(title: Text("My App Bar")),
          body: getPage(_currentIndex),
          bottomNavigationBar: BottomNavigationBar(
            type: BottomNavigationBarType.fixed,
            items: [
              BottomNavigationBarItem(
                  icon: Icon(Icons.first_page), title: Text('')),
              BottomNavigationBarItem(
                  icon: Icon(Icons.last_page), title: Text('')),
            ],
            onTap: onTabTapped,
            currentIndex: _currentIndex,
          ),
        ));
  }
}
0
ответ дан attdona 23 January 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: