gpt4 book ai didi

ListView 或 BLoC 的 Flutter 状态恢复

转载 作者:行者123 更新时间:2023-12-05 06:55:52 34 4
gpt4 key购买 nike

在 android 使用 RootRestorationScope 从内存中杀死我的应用程序后,我正在尝试恢复我的 ListView 小部件:

runApp(RootRestorationScope(
child: MaterialApp(home: MyApp()),
restorationId: "root",
));

并使用 extends RestorableValue 制作我自己的可恢复小部件:

class RestorableListBloc extends RestorableValue<ListBloc> {
@override
ListBloc createDefaultValue() {
return ListBloc(
repository: Repository(),
)..add(
Fetch(),
);
}

@override
void didUpdateValue(ListBloc oldValue) {
if (oldValue.state != value.state) {
notifyListeners();
}
}

@override
ListBloc fromPrimitives(Object data) {
print('data: ' + data);
return ListBloc(repository: data);
}

@override
Object toPrimitives() {
return value.repository;
}
}

其中 ListBloc 是一个 Bloc,它控制我的 ListView 小部件中的内容(现在是计时器的集合,以防有人好奇)。

我使用恢复混合扩展了类,并调用了 multibloc providers widget 中的 bloc,如下所示:

class _MyAppState extends State<MyApp> with RestorationMixin {
SpeedDialGenerator speedDial = SpeedDialGenerator();
RestorableListBloc _test = RestorableListBloc();
final assetsAudioPlayer = AssetsAudioPlayer();

@override
Widget build(BuildContext context) {
return BlocProvider(
create: (BuildContext context) => DrawerCubit(value: false),
child: Scaffold(
backgroundColor: Colors.blue[50],
drawer: SafeArea(
child: AppDrawer(),
),
appBar: AppBar(
backgroundColor: Colors.blue[900],
title: Text('Myapp'),
centerTitle: true,
actions: [
IconButton(
icon: Image.asset('assets/images/myapp_white.png'),
onPressed: () {},
),
],
),
body: Stack(children: [
HourglassBackground(),
MultiBlocProvider(
providers: [
BlocProvider(
create: (context) => _test.value,
),
BlocProvider(
create: (context) => AppStateCubit(),
)
],
child: BlocBuilder<ListBloc, ListState>(
builder: (context, state) {
if (state is Failure) {
return Center(
child: Text('Oops something went wrong!'),
);
}
if (state is Loaded) {
return Stack(children: [
HomePage(state: state, displayNotification: () => {}),
Padding(
padding: EdgeInsets.fromLTRB(0, 0, 10, 10),
child: BlocProvider(
create: (context) => TimerpopupCubit(),
child: speedDial.buildSpeedDial(context)),
),
]);
}
return Center(
child: CircularProgressIndicator(),
);
},
)),
]),
),
);
}

@override
String get restorationId => 'root';

@override
void restoreState(RestorationBucket oldBucket, bool initialRestore) {
registerForRestoration(_test, restorationId);
}

不幸的是,每次我运行应用程序时,我都会得到:

The following assertion was thrown building Builder:
'package:flutter/src/services/restoration.dart': Failed assertion: line 592 pos 12: 'debugIsSerializableForRestoration(value)': is not true.

文档不多,我知道这是 Flutter 的一个相对较新的功能,但据我所知,这意味着您目前无法恢复 BLoC?

是否有解决此问题的方法或我应该考虑的其他方法?

谢谢

最佳答案

有一些方法,例如使用具有内置功能的 HydratedBloc 库来保存其状态。

或者您可以实现自己的本地数据库,当用户重新运行应用程序时,存储库首先返回本地数据,然后返回远程数据。

关于ListView 或 BLoC 的 Flutter 状态恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65258054/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com