обновить данные из сети, используя будущего построителя, нажав на нажатое действие из другого класса дротиков - PullRequest
0 голосов
/ 21 мая 2019

У меня есть класс виджетов с сохранением состояния app_body.dart, который извлекает некоторые данные из API и отображает их с помощью будущего построителя.ниже приведен пример кода из app_body.dart

import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'dart:convert';

import './my_app_bar.dart';

class AppBody extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _AppBodyState();
  }
}

class _AppBodyState extends State<AppBody> {

  Future _fetchLogData() async {
    final response = await http.get('api url');
    if (response.statusCode == 200) {
      return UserDetailHandler.fromJson(json.decode(response.body));
    } else {
      throw Exception('Failed to load post');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: MyAppBar(_fetchLogData),
      body: Center(
        child: FutureBuilder(
          future: _fetchLogData(),
          builder: (context, snapshot) {
            if (snapshot.hasData) {
              return Container(
                  child: Column(children: <Widget>[
                    Text('Last Synced' + ' ' + snapshot.data.lastUpdatedAt)]));
            } else if (snapshot.hasError) {
              return Text("${snapshot.error}");
            }
            return CircularProgressIndicator();
          },
        ),
      ),
    );
  }
}

// class which instantiate all the details from the API Part
class UserDetailHandler {
  final String lastUpdatedAt;

// constructor to intialise
  UserDetailHandler({this.lastUpdatedAt});

// assign values to the class object
  factory UserDetailHandler.fromJson(Map<String, dynamic> json) {
    return UserDetailHandler(lastUpdatedAt: json['updated_at']);
  }
}

Также после нажатия на значок обновления в другом классе без сохранения состояния под названием my_app_bar.dart, который содержит панель приложений и действия, которые необходимо выполнить.Моя цель - обновить данные, отображаемые в app_body.dart. Для этого я просто передал свой метод вызова API в виджет без сохранения состояния и вызвал его при действии onPressed кнопки обновления my_app_bar.Вызывается API, но данные не обновляются.

Ниже приведен пример кода из my_app_bar.dart

import 'package:flutter/material.dart';

class MyAppBar extends StatelessWidget implements PreferredSizeWidget {

  final Function refreshLogData;
  MyAppBar(this.refreshLogData);

  @override
  Widget build(BuildContext context) {
    return AppBar(
        actions: <Widget>[
          IconButton(
            icon: new Icon(Icons.refresh),
            alignment: Alignment.topCenter,
            tooltip: 'refresh the Data',
            onPressed: () {
              print('log data');
              refreshLogData();
            },
          )
        ],
        title: Center(
            child: Text(
          'Random Data',
          textAlign: TextAlign.center,
        )));
  }

  @override
  Size get preferredSize => new Size.fromHeight(kToolbarHeight);
}

Я что-то упустил или мне нужно сделать что-то дополнительное, как указано выше.Я нашел много статей, чтобы обновить данные, когда кнопка присутствует в части AppBody.Здесь в моем коде 2 файла, а значок обновления существует в другом классе appBar.

Пожалуйста, сообщите, TIA.

1 Ответ

0 голосов
/ 22 мая 2019

Из предоставленного кода измените эти строки

........
 IconButton(
            .....
            .....
            onPressed: refreshLogData,
          )
        ],

.........

, тогда метод refreshLogData будет работать, и после завершения вызова сервера вам необходимо обновить экран, используя setState.

Лучшее предложение вместо Future использовать StreamBuilder, тогда оно будет работать без проблем.

...