我已經做了4天了,讀了一半的Google,看了3/4的Youtube。我有一個物件的串列,我從API獲取資料。當這些物件被生成卡片時,Checkbox的開關沒有功能,setState對它們沒有任何影響。這是最初的代碼,在我開始嘗試一些東西并把代碼搞亂之前(感謝Git)。
有人有什么想法嗎?
import 'dart:convert';
import 'dart:developer';
import 'package:flutter/cupertino.dart'。
import 'package:flutter/material.dart';
import 'package:mojmegatel/API/get_settings_api.dart';
import 'package:mojmegatel/api/set_settings_api.dart';
import 'package:share_preferences/shared_preferences.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart'。
import './constants.dart';
import 'dart:io';
class SettingsArray extends StatefulWidget{
final ValueChanged onChanged。
final bool isSwitched;
const SettingsArray({
required this.onChanged,
required this.isSwitched,
key? key。
}) : super(key: 關鍵)。
@override
_SwitchWidget createState() => _SwitchWidget()。
}
class _SwitchWidget extends State< SettingsArray> {
未來? dataFuture。
bool isSwitched = false。
@override
void initState() {
isSwitched = false;
dataFuture = _getData();
super.initState()。
}
_getData() async {
await GetSettings()。
SharedPreferences sharedPrefs = await SharedPreferences.getInstance()。
String sharedPrefsSettings = sharedPrefs.getString('settings'/span>).toString()。
String jsonSettings = await DefaultAssetBundle.of(context).loadString("assets/json/settings_data.json")。
String mergedData = await MergeData(jsonSettings, sharedPrefsSettings)。
return mergedData。
}
Future<String> MergeData(String jsonSettings, String sharedPrefsSettings) async {
var decodedJsonSettings = json.decode(jsonSettings)。
var decodedSharedPrefsSettings = json.decode(sharedPrefsSettings);
String mergedSettings = ' [';
bool found_id = false;
bool is_last = false;
String service_id。
String name;
String description;
String serviceicerequestvalue;
for (int i = 0; i < decodedJsonSettings.length; i ) {
for (int j = 0; j < decodedSharedPrefsSettings.length; j ) {
if (decodedJsonSettings[i]['service_id'] == decodedSharedPrefsSettings[j]['service_id'] ){
found_id = true;
service_id = decodedJsonSettings[i]['service_id']。
name = decodedJsonSettings[i]['title']。
description = decodedJsonSettings[i]['description']。
serviceerequestvalue = decodedSharedPrefsSettings[j]['servicerequestvalue']。
mergedSettings = '{"service_id": "$service_id",'。
mergedSettings = '"name": "$name",'。
mergedSettings = '"description": "$description",'。
mergedSettings = '"servicerequestvalue": "$servicerequestvalue"}'。
if (i == decodedJsonSettings.length - 1 && j == decodedSharedPrefsSettings.length - 1) {
// Nothing, don't complicate
} else {
mergedSettings = ','/span>;
}
}
}
if (found_id == false) {
service_id = decodedJsonSettings[i]['service_id'] 。
name = decodedJsonSettings[i]['title']。
description = decodedJsonSettings[i]['description']。
mergedSettings = '{"service_id": "$service_id",'。
mergedSettings = '"name": "$name",'。
mergedSettings = '"description": "$description",'。
mergedSettings = '"servicerequestvalue": "0"}'。
if (i == decodedJsonSettings.length - 1) {
// Nothing, don't complicate
} else {
mergedSettings = ','/span>;
}
} else {
found_id = false;
}
}
mergedSettings = ']'。
return mergedSettings。
}
Widget build(BuildContext context) {
List<Widget> widgetList = <Widget> [];
return ListView.builder(
shrinkWrap: true,
物理學。ScrollPhysics()。
itemCount: 1。
itemBuilder。(context, index) {
return FutureBuilder(
future: dataFuture,
builder: (context, snapshot) {
if ( snapshot.data != null) {
String service_id。
String name;
String description;
var settingsData = json.decode(snapshot.data.toString() )。
List<dynamic> list = settingsData;
widgetList = <Widget>[];
for (int i = 0; i < list.length; i ) {
String serviceRequestValue = settingsData[i]['servicerequestvalue'].toString()。
bool serviceRequestValueBool = true;
service_id = settingsData[i]['service_id'].toString()。
name = settingsData[i]['name'].toString();
description = settingsData[i]['description'].toString()。
log(service_id)。
if (serviceRequestValue == "1" || serviceRequestValue == "1,1" || serviceRequestValue == "14") {
serviceRequestValueBool = true。
} else {
serviceRequestValueBool = false。
}
widgetList.add(settingsContainer(service_id, service_id, name, description, serviceRequestValueBool))。
}
return Column(children: widgetList.toList() );
}
return Column(
children: [
容器(
width: 60.0,
高度。80.0。
padding: EdgeInsets.fromLTRB(0.0, 20.0, 0.0, 0.0)。
孩子。SpinKitFoldingCube(color: MojMegaTelTheme.megaTelBlue), // CircularProgressIndicator(),/span>
),
],
);
},
);
},
);
Widget settingsContainer(String key, String serviceId, String title, String description, bool isSwitched) {
return Padding(
key: ValueKey(key)。
padding: const EdgeInsets.only( left: 24, right: 24, top: 16, bottom: 18)。)
孩子。容器(
裝飾。BoxDecoration(
color: MojMegaTelTheme.white,
borderRadius: borderRadius.only(topLeft: Radius.circular(8.0), bottomLeft: Radius.circular(8.0) , bottomRight: Radius.circular(8.0), topRight: Radius.circular(8.0))。
boxShadow: <BoxShadow>[
BoxShadow(color: MojMegaTelTheme.gray.withOpacity(0.2), offset: Offset(1.1, 1.1), blurRadius: 10.0)。)
],
),
孩子。列(
children: <Widget>[
padding(
padding: const EdgeInsets.only(top: 16, left: 16, right: 24)。)
孩子。列(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
行(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
行(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Padding(
padding: const EdgeInsets.only( left: 4, bottom: 3)。)
孩子。行(
兒童。[
文本(
標題。
溢位。TextOverflow.fade,
maxLines: 1。
softWrap。false。
textAlign: TextAlign.center,
風格。文本樣式(
fontFamily: MojMegaTelTheme.fontName,
fontWeight: FontWeight.w600,
字體大小。14,
color: MojMegaTelTheme.darkerText,
),
),
],
),
),
填充(
padding: const EdgeInsets.only(left: 8) 。
兒童。行(
兒童。[
Checkbox(
value: isSwitched,
onChanged: (value) {
設定狀態(
() {
isSwitched = value!
log("Swich: " isSwitched.toString())。
},
);
},
),
],
),
),
],
),
],
)
],
),
),
填充(
padding: const EdgeInsets.only( left: 24, right: 24, top: 8, bottom: 8)。)
孩子。容器(
高度。2,
裝飾。BoxDecoration(
color: MojMegaTelTheme.background,
borderRadius: borderRadius.all(Radius.round(4.0))。
),
),
),
填充(
padding: const EdgeInsets.only(left: 24, right: 24, top: 8, bottom: 16)。)
孩子。行(
children: <Widget>[
展開(
孩子。列(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
填充()
padding: const EdgeInsets.only(top: 6) 。
孩子。文本(
描述。
textAlign: TextAlign.left,
風格。文本風格(
fontFamily: MojMegaTelTheme.fontName,
fontWeight: FontWeight.w600,
字體大小。12,
color: MojMegaTelTheme.gray.withOpacity(0.5)。
),
),
),
],
),
),
],
),
)
],
),
),
);
}
}
uj5u.com熱心網友回復:
問題出在這里:
if (serviceRequestValue == "1"/span> || serviceRequestValue == "1。 1" || serviceRequestValue == "14") {
serviceRequestValueBool = true。
} else {
serviceRequestValueBool = false。
}
你的復選框狀態已經改變了,但它將重建你的整個有狀態的部件,所以上面的代碼將把它帶回最后的狀態。你可以為開關創建一個單獨的有狀態的部件,讓它自己重建來解決這個問題。
uj5u.com熱心網友回復:
你應該用StatefulBuilder小部件來包裝你的小部件。
StatefulBuilder(
builder: (context, _setState) => // Your Widget );
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/315681.html
標籤:
下一篇:WPFListViewTemplateInvalidCastException:'無法將'System.Windows.Controls.ListView'型別的物件轉換
