大家好,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
),
);
我解决了我的问题,这完全是因为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),
),
),
],
);
},
);
},
);