我正在嘗試在 flutter 中實作一個動態串列視圖,可以通過點擊浮動肌動蛋白按鈕來增加它。但是浮動操作按鈕的 onPressed 方法只更新一次。
以下是我的 UI 和顫振塊代碼:-
import 'package:demo/bloc/main/demo_bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "Demo",
home: DemoApp(),
);
}
}
class DemoApp extends StatelessWidget {
const DemoApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocProvider(
lazy: false,
create: (context)=>DemoBloc([54,4,598,984,654,87,5,897,65,46,84,65,4984,]),
child: Scaffold(
appBar: AppBar(
title: Text("Demo"),
),
body: NumberList(),
floatingActionButton: BlocBuilder<DemoBloc, List<int>>(
builder: (context, state){
return FloatingActionButton(
onPressed: (){
BlocProvider.of<DemoBloc>(context).addItem(12);
}
);
},
),
),
);
}
}
class NumberList extends StatelessWidget {
const NumberList({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocBuilder<DemoBloc, List<int>>(builder: (context, state) {
return ListView.builder(
itemCount: BlocProvider.of<DemoBloc>(context).state.length,
itemBuilder: (context, index) {
return Text(
BlocProvider.of<DemoBloc>(context).state[index].toString()
);
});
});
}
}
import 'package:flutter_bloc/flutter_bloc.dart';
class DemoBloc extends Cubit<List<int>>{
DemoBloc(List<int> initialState) : super(initialState);
addItem(int value){
print("adding item to the numbers list");
state.add(value);
emit(state);
}
removeItem(){
state.removeLast();
emit(state);
}
removeItemFrom(int index){
state.removeAt(index);
emit(state);
}
}
我在 addItem() 函式中使用了列印函式,它正在執行并在控制臺中列印,但串列沒有被更新,只有一次。
uj5u.com熱心網友回復:
您BlocProvider需要在小部件層次結構中處于更高的位置。現在,每次呼叫構建函式時都會創建一個新的 BloC。這將消除您所做的任何更改,因為每次更改都會觸發構建,并且每次構建都會將您的狀態重置為開始。
您BlocProvider需要在任何構建功能之外。在任何情況下,您都不想因為重建而重置您的資料。
您可以將它作為根小部件放在 main 方法中,并使您的應用成為子應用。
uj5u.com熱心網友回復:
試試這個
addItem(int value) {
print("adding item to the numbers list");
final newList = [...state];
newList.add(value);
emit(newList);
}
問題是您第一次發出的串列實際上是同一個物件。因此,您需要將串列克隆到全新的串列中。使用不可變物件作為塊狀態更容易。您可以將凍結包用于類,將 kt_dart 或 built_collection 用于集合資料型別。對于不可變資料型別,您必須創建新物件而不是改變現有物件,以便 bloc 可以知道它是一種新狀態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/390012.html
上一篇:Flutter將影像構建為地圖
