, поэтому я пытаюсь создать список в своем провайдере из будущего вызова.
Пока у меня есть следующий класс ChangeNotifier ниже:
class MainProvider extends ChangeNotifier {
List<dynamic> _list = <dynamic>[];
List<dynamic> get list => _list;
int count = 0;
MainProvider() {
initList();
}
initList() async {
var db = new DatabaseHelper();
addToList(Consumer<MainProvider>(
builder: (_, provider, __) => Text(provider.count.toString())));
await db.readFromDatabase(1).then((result) {
result.forEach((item) {
ModeItem _modelItem= ModeItem.map(item);
addToList(_modelItem);
});
});
}
addToList(Object object) {
_list.add(object);
notifyListeners();
}
addCount() {
count += 1;
notifyListeners();
}
}
Однако это что происходит всякий раз, когда я использую значение list :
- Я могу подтвердить, что моя функция initList выполняется правильно
- Исходное содержимое из доступное значение list - это виджет Text () , который я впервые вставил с помощью функции addToList , что означает, что в список на данный момент
- Когда я выполняю «Горячую перезагрузку», остальное содержимое списка теперь кажется
Примечания:
- Я использую значение list в виджете AnimatedList, поэтому я должен показать содержимое list
- Изначально кажется, что содержимое моего списка значение - только один элемент
- Мой список значение не отображается для автоматического обновления во время выполнения моего вызова Future
- Однако, когда я пытаюсь вызвать функцию addCount, она обычно обновляет значение count без необходимости выполнять горячую перезагрузку - это кажется для правильной работы
- Похоже, что вызов Future не обновляет должным образом содержимое моего списка значение
Моя актуальная проблема заключается в том, что при начальной загрузка, мой список значений не правильно инициализирует все свои значения, как задумано
Надеюсь, вы, ребята, можете помочь мне в этом. Спасибо.
ОБНОВЛЕНИЕ: Ниже показано, как я использую класс ChangeNotifier выше
class ParentProvider extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
ChangeNotifierProvider<MainProvider>(
create: (context) => MainProvider(),
),
],
child: ParentWidget(),
);
}
}
class ParentWidget extends StatelessWidget {
final GlobalKey<AnimatedListState> listKey = GlobalKey<AnimatedListState>();
@override
Widget build(BuildContext context) {
var mainProvider = Provider.of<MainProvider>(context);
buildItem(BuildContext context, int index, Animation animation) {
print('buildItem');
var _object = mainProvider.list[index];
var _widget;
if (_object is Widget) {
_widget = _object;
} else if (_object is ModelItem) {
_widget = Text(_object.unitNumber.toString());
}
return SizeTransition(
key: ValueKey<int>(index),
axis: Axis.vertical,
sizeFactor: animation,
child: InkWell(
onTap: () {
listKey.currentState.removeItem(index,
(context, animation) => buildItem(context, index, animation),
duration: const Duration(milliseconds: 300));
mainProvider.list.removeAt(index);
mainProvider.addCount();
},
child: Card(
child: Padding(
padding: const EdgeInsets.all(32.0),
child: _widget,
),
),
),
);
}
return Scaffold(
appBar: AppBar(),
body: Container(
color: Colors.white,
child: Padding(
padding: const EdgeInsets.all(32.0),
child: mainProvider.list == null
? Container()
: AnimatedList(
key: listKey,
initialItemCount: mainProvider.list.length,
itemBuilder:
(BuildContext context, int index, Animation animation) =>
buildItem(context, index, animation),
),
),
),
);
}
}