TabBar параметр настройки состояния вкладок - PullRequest
0 голосов
/ 27 мая 2018

У меня есть главная страница с вкладкой с 5 вкладками.На главной странице я загружаю JSON из Интернета и устанавливаю разные его части на каждой вкладке.Это приложение чемпионата мира, показывающее вкладку для каждого матча (группы, раунд 16, четвертьфинал, полуфинал и финал).Когда каждая вкладка загружена, я получаю json и создаю представление списка.

Кроме того, я хочу установить кнопку для перезагрузки информации (что-то вроде fab или действия в панели приложений).Но когда я перезагружаю JSON, как мне установить текущую вкладку?

Это моя сборка виджетов на главной странице:

Widget build(BuildContext context) {
return new Scaffold(
  appBar: new AppBar(
    leading: new IconButton(
      icon: new Icon(Icons.arrow_back),
      onPressed: () => Navigator.pop(context),
    ),
    title: new Text(title),
  ),
  body: new Center(
    child: new TabBarView(
      controller: _tabController,
      children: <Widget>[
        new GroupStageMatches(),
        new RoundOfSixteen(),
        new QuarterFinals(),
        new SemiFinal(),
        new Final(),
      ],
    ),
  ),
  bottomNavigationBar: new Material(
    color: Colors.blueAccent,
    child: new TabBar(
      controller: _tabController,
      tabs: <Widget>[
        new Tab(text: "Grupos"),
        new Tab(text: "Oitavas"),
        new Tab(text: "Quartas"),
        new Tab(text: "Semi"),
        new Tab(text:"Final"),
      ],
    ),
  ),
  floatingActionButton: new FloatingActionButton(
    onPressed: () {
      setState(() {
        sing.updateData();
      });
    }
  ),
);}

1 Ответ

0 голосов
/ 27 мая 2018

Самое простое решение - создать valueNotifier в вашем синглтоне

  ValueNotifier<String> valueNotifier = new ValueNotifier<String>("");

Затем внутри каждой вкладки в initState do

sing.valueNotifier.addListener(_valueChanged)

и dispose очистить слушателей.

чтобы уведомить слушателей, вы бы изменили значение.Если значение отличается от предыдущего, оно уведомит об этом слушателей.Это вызовет _valueChanged метод

sing.valueNotifier.value = "HelloWorld";

После вызова _valueChanged вы можете установить состояние на своей вкладке.

РЕДАКТИРОВАТЬ: на основе примера кода

Вывидите, средство уведомления о значении содержит значение, которое вам понадобится в вашем классе.поэтому после разрешения getJSON слушатель будет вызван на ваш взгляд.

class Singleton {
  static final Singleton _singleton = new Singleton._internal();
  ValueNotifier<Map<String, dynamic>> groupsJson =
      new ValueNotifier<Map<String, dynamic>>(null);
  ValueNotifier<Map<String, dynamic>> eliminationJson =
      new ValueNotifier<Map<String, dynamic>>(null);

  factory Singleton() {
    return _singleton;
  }

  Singleton._internal() {
    // updateData();
  }


  updateGroupsJson() async {
    _groupsJson.value = await this.getJson(
        "http://www.srgoool.com.br/call?ajax=get_classificacao2&id_fase=1796");
  }

  updateEliminationJson() async {
    _eliminationJson.value = await this.getJson(
        "http://www.srgoool.com.br/call?ajax=get_chaves&id_ano_campeonato=434");
  }

  Future<Map<String, dynamic>> getJson(url) async {
    print("loading");
    final response = await http.get(url);

    if (response.statusCode == 200) {
      print("loaded");
      var teste = json.decode(response.body);
      return teste;
    } else {
      print("erro");
      return null;
    }
  }
}

На ваш взгляд:

void initState() {
  super.initState();
  sing = new Singleton();
  sing.groupsJson.addListener(onGroupJson);
  sing.updateGroupsJson();

  //you can already draw your frontend with latest groupsJson. Thiss will just update the view when you get a new one
}

void onGroupJson{
  setState ((){
    // assing fields that you need for drawing the view 
  });
}
...