对话框关闭后刷新列表视图内容

问题描述 投票:0回答:1

大家好,Flutter刚开始接触,尝试在这里问任何东西之前学到我需要的东西,我有这种情况,我有浮动操作按钮,当我选择一些选项并单击保存更改时会显示一个对话框,应关闭对话框并刷新列表视图,这取决于我的选择,这是我的代码一切正常,发现其调用为getData(),但UI中没有任何更改。

import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:grouped_buttons/grouped_buttons.dart';
import 'package:test/models/Player.dart';
import 'package:test/partials/PlayerCard.dart';
import 'dart:async';
import 'package:http/http.dart' as http;
import 'dart:convert';
import 'package:connectivity/connectivity.dart';
import 'package:rflutter_alert/rflutter_alert.dart';
import 'package:shared_preferences/shared_preferences.dart';

class MyAppScreen extends StatefulWidget {
  @override
  _MyAppScreenState createState() => new _MyAppScreenState();
}

class _MyAppScreenState extends State<MyAppScreen> {
  List<Player> _players = [];
  String _filters ;
  String filters ;
  String sort ;
  String _sort;

  int _page = 1;
  final String _token = "xxxxxxxxxxxxxxxxxxxxxxxx";
  ScrollController _scrollController = new ScrollController();
  Future<Null> getData() async {

    isConnected().then((intenet) async{
      if (intenet != null && intenet) {
        var url = 'https://example.com/api';
        final responseData = await http.post(
            url,
            body: {'token':_token,'page': "$_page",'order': filters,'sort': sort},
            headers: {
          "Accept": "application/json"
        });
        //print("$url/$filters/$sort");
        if(responseData.statusCode == 200){
          final data = jsonDecode(responseData.body);
          setState(() {
            for(Map i in data['data']){
              _players.add(Player.fromJson(i));
            }
          });
        }
        _page++;
      }
      // No-Internet Case
    });
  }
  @override
  void initState() {
    super.initState();
    _getDatafromSF();
    getData();
    _scrollController.addListener(() {
      if (_scrollController.position.pixels == _scrollController.position.maxScrollExtent) {
        getData();
      }
    });
  }
  @override
  void dispose() {
    super.dispose();
    _scrollController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      extendBody: true,
      floatingActionButtonLocation: FloatingActionButtonLocation.endDocked,
      floatingActionButton: FloatingActionButton(onPressed: _showFilter,elevation: 8, child: Icon(FontAwesomeIcons.filter),),
      bottomNavigationBar: BottomAppBar(
        shape: CircularNotchedRectangle(),
        child: Container(
          height: 20.0,
          color: Colors.white,
        ),
      ),
      body: Container(
        child: ListView.builder(
          controller: _scrollController,
          itemBuilder: (context, i){
            if(i == _players.length - 1){
              return loadingView();
            }
            final nDataList = _players[i];
            return PlayerCard(nDataList);
            if (i < _players.length){
              final nDataList = _players[i];
              return PlayerCard(nDataList);
            }else{
              getData();
              return loadingView();
            }
          },
          itemCount: _players.length,
        ),
      ),
    );
  }

  // method defined to check internet connectivity
  Future<bool> isConnected() async {
    var connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.mobile) {
      return true;
    } else if (connectivityResult == ConnectivityResult.wifi) {
      return true;
    }
    return false;
  }


  Future<bool> _showFilter() async{
    return Alert(
        context: context,
        title: "Filter",
        content: Column(
          children: <Widget>[
            Text("Order By",style: TextStyle(color: Colors.black54,fontSize: 16),),
            Divider(height: 3.0, color: Colors.black),
            RadioButtonGroup(
              orientation: GroupedButtonsOrientation.VERTICAL,
              activeColor: Colors.blue[800],
              onSelected: (String selected) => setState(() {
                _filters = selected;
                switch(_filters){
                  case "Platinum": filters = 'platinum';break;
                  case "Name": filters = 'name';break;
                  case "Total Trophies": filters = 'total';break;
                  default: filters = 'platinum';break;
                }
                print(filters);
              }),
              labels: <String>[
                "Platinum",
                "Name",
                "Total Trophies",
              ],
              labelStyle: TextStyle(fontSize: 14),
              picked: _filters,
            ),
            Divider(height: 5.0, color: Colors.black),
            Text("Sort By",style: TextStyle(color: Colors.black54,fontSize: 16),),
            new Padding(
              padding: new EdgeInsets.all(5.0),
            ),
            RadioButtonGroup(
              orientation: GroupedButtonsOrientation.VERTICAL,
              activeColor: Colors.blue[800],
              onSelected: (String selected) => setState(() {
                _sort = selected;
                _sort == "Ascending" ? sort = 'asc' : sort = 'desc';
                print(sort);
              }),
              labels: <String>[
                "Ascending",
                "Descending",
              ],
              labelStyle: TextStyle(fontSize: 14),
              picked: _sort,
            )
          ],
        ),
        buttons: [
          DialogButton(
            onPressed: _savetoSF,
            child: Text(
              "Save Changes",
              style: TextStyle(color: Colors.white, fontSize: 20),
            ),
          )
        ]).show();
  }


  _savetoSF() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('order', filters);
    prefs.setString('sort', sort);
    prefs.setString('orderstring', _filters);
    prefs.setString('sortstring', _sort);
    Navigator.pop(context);
    getData();
  }

  void _getDatafromSF() async{
    SharedPreferences prefs = await SharedPreferences.getInstance();
    //Return String
    String myorder = prefs.getString('order')?? "platinum";
    String mysort = prefs.getString('sort')?? "desc";
    String filterString = prefs.getString('orderstring')?? "Platinum";
    String sortString = prefs.getString('sortstring')?? "Descending";
    filters = myorder;
    _filters = filterString;
    sort = mysort;
    _sort = sortString;
  }
}


Widget loadingView() => Center(
  child: CircularProgressIndicator(
      backgroundColor: Colors.lightBlueAccent,
      strokeWidth: 10.0
  ),
);

listview flutter future
1个回答
0
投票

我解决了我的问题,这完全是因为Context,Dialog使用了不同的上下文,我通过使用StatefulBuilder解决了问题,所以对话框必须像这样

    return showDialog(
      context: context,
      builder: (context) {
        String contentText = "Content of Dialog";
        return StatefulBuilder(
          builder: (context, setState) {
            return AlertDialog(
              title: Text("Filter"),
              content: _buildDialogContent,
              actions: <Widget>[
                FlatButton(
                  onPressed: () => Navigator.pop(context),
                  child: Text("Cancel"),
                ),
                DialogButton(
                  onPressed: _savetoSF,
                  child: Text(
                    "Save Changes",
                    style: TextStyle(color: Colors.white, fontSize: 16),
                  ),
                ),
              ],
            );
          },
        );
      },
    );

© www.soinside.com 2019 - 2024. All rights reserved.