我想更改肘部的布尔值,但我不知道该怎么做。
我想要实现的是,例如: if (以立方位存储的布尔值为 true) "show widget A" : "show widget B"
我的代码:
class ChangeBoolCubit extends Cubit<bool> {
ChangeBoolCubit() : super(false);
bool one = false;
bool two = true;
void changeValue(bool booleanToChange) {
booleanToChange = !state;
emit(booleanToChange);
}
}
Run Code Online (Sandbox Code Playgroud)
看法:
class BoolView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Changing Bool')),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Center(
child: BlocBuilder<ChangeBoolCubit, bool>(
builder: (context, state) {
return (ChangeBoolCubit().one)
? Text('TRUE: ${ChangeBoolCubit().one}')
: Text('FALSE: …Run Code Online (Sandbox Code Playgroud) 我面临一个问题,在 flutter 中更改屏幕后不调用 dispose 方法。首先这里是源代码。
class Game extends StatefulWidget {
Game({Key key, this.title}) : super(key: key);
final String title;
@override
_GameState createState() => new _GameState();
}
class _GameState extends State<Game> with SingleTickerProviderStateMixin {
final CrosswordController myController = CrosswordController();
var chewieController = null;
var videoPlayerController = null;
Widget makeVideoStreaming(){
videoPlayerController = VideoPlayerController.network("https://somelink.com");
chewieController = ChewieController(//paramtere here
);
}
@override
void initState() {
super.initState();
this.makeVideoStreaming();
_controller = AnimationController(vsync: this, duration: Duration(minutes: gameTime));
}
@override
void dispose(){
print('DISPOSE CALLED- GAME---');
videoPlayerController.dispose();
chewieController.dispose();
_controller.dispose(); …Run Code Online (Sandbox Code Playgroud) 我正在学习状态管理,flutter大部分时间遇到单词business logic ui logic,有一段时间presentation logic,我在互联网上搜索它,人们用不同的语言解释它,我无法更好地理解,有人可以展示这三种类型logic以一个例子的形式解释它很干净和容易吗?
我正在开发一个新的应用程序并使用状态通知程序测试 Riverpod,并且有一个关于在构建页面时可以在哪里加载初始数据的问题。
我有以下状态类:
abstract class SalesOrderListState extends Equatable {
const SalesOrderListState();
@override
List<Object> get props => [];
}
class SalesOrderListInitial extends SalesOrderListState {}
class SalesOrderListLoading extends SalesOrderListState {}
class SalesOrderListSuccess extends SalesOrderListState {
final List<SalesOrderListItem> salesOrderListItems;
SalesOrderListSuccess({
@required this.salesOrderListItems,
});
@override
List<Object> get props => [salesOrderListItems];
}
class SalesOrderListError extends SalesOrderListState {
final String error;
const SalesOrderListError({@required this.error});
@override
List<Object> get props => [error];
}
Run Code Online (Sandbox Code Playgroud)
和这个 state_notifier 类:
final salesOrderListStateNotifierProvider =
StateNotifierProvider<SalesOrderListStateNotifier>(
(ref) => SalesOrderListStateNotifier(ref.read));
class SalesOrderListStateNotifier extends StateNotifier<SalesOrderListState> { …Run Code Online (Sandbox Code Playgroud) 有人可以给出一个在 Riverpods 中最好使用 Riverpod_hooks 进行额外状态修改的示例 - 我希望能够在不制作额外小部件的情况下使用它,例如:
onPress: () {
useProvider(genderProvider).state = Gender.female;
},
Run Code Online (Sandbox Code Playgroud)
我在理解 Riverpods 文档中关于如何使用该提供程序(一旦实现该提供程序)时遇到了一些困难。我理解增量部分.state++,但我找不到初始化后更改状态值的明确示例。正如 x 被初始化为零,但您只想将其设为 42 或输入值。
例如,我有一个性别 {male、female、non-binary} 枚举,并且创建了一个 GenderProvider,但我无法找出使用按钮更改应用程序中性别的最佳方法。我也不完全确定 Provider 和 RiverPods 有多相似,似乎有很多语义差异?
这是当前在我的代码中声明提供程序的方式:
enum Gender {
male,
female,
nonBinary
}
final genderProvider = StateProvider((_) => Gender.female);
Run Code Online (Sandbox Code Playgroud)
预先感谢,我感谢任何建议。
flutter flutter-dependencies flutter-state flutter-hooks riverpod
主要.dart:
import 'package:flutter/material.dart';
import 'package:mypackage/widgets/home_widget.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: "My App",
theme: ThemeData(primarySwatch: Colors.blueGrey),
home: Home(),
);
}
}
Run Code Online (Sandbox Code Playgroud)
主页.dart:
import 'package:flutter/material.dart';
import 'package:mypackage/widgets/secondary_page.dart';
import 'package:mypackage/widgets/home_view.dart';
import 'package:mypackage/widgets/settings_page.dart';
class Home extends StatefulWidget {
@override
State<StatefulWidget> createState() {
return _HomeState();
}
}
class _HomeState extends State<Home> {
int currentPageIndex = 0;
final List<Widget> pageWidgets = [HomeView(), SecondaryPage(), SettingsPage()];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: …Run Code Online (Sandbox Code Playgroud) 我只想在屏幕上拖动小部件,而不是拖放。
但是,每当我离开它并再次开始拖动时,它就会开始从开始的位置开始拖动。就好像它是一样reset。
我的猜测是 build 被一次又一次地调用,所以它会自动使用original position values. 我该如何解决?代码应该是什么?
换句话说,position就是设置为结束(100, 100)之后DragEvent。然后下一个拖动开始位置,(100, 100)而不是小部件被放置到的最后位置。
我也尝试过这个GlobalPosition,但得到了相同的结果。这是我的代码:
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
double x1 = 100.0;
double x2 = 200.0;
double y1 = 100.0;
double y2 = 200.0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text('Drag widget on screen'),
),
body: Stack(
children: [
Positioned( …Run Code Online (Sandbox Code Playgroud) dart flutter flutter-positioned flutter-state flutter-android
我是 flutter 中的 Bloc 新手,任何人都可以解释一下我何时应该在 Blocs 中使用 add() 以及何时使用 emmit ?
我是颤振新手,这是我第一次在我的一个项目中实现底部导航栏,但我很困惑为什么它不允许我切换屏幕。不知何故,我可以点击图标,但点击时不会切换页面。
我在 Youtube 的一个教程中得到了这段代码,从视频来看它似乎运行良好。
class NavBar extends StatefulWidget {
static const String route = 'navbar';
const NavBar({Key? key}) : super(key: key);
@override
State<NavBar> createState() => _NavBarState();
}
class _NavBarState extends State<NavBar> {
@override
Widget build(BuildContext context) {
int pageIndex = 0;
final AuthController auth = locator<AuthController>();
final List<Widget> pages = [
const HomeScreen(),
const ArtistsScreen(),
const ChatHomeScreen(),
const ProfileScreen(),
];
return Scaffold(
body: pages[pageIndex],
bottomNavigationBar: BottomNavigationBar(
type: BottomNavigationBarType.fixed,
backgroundColor: const Color(0xffE28D00),
selectedItemColor: Colors.white,
unselectedItemColor: Colors.white70,
currentIndex: pageIndex,
elevation: 3,
showUnselectedLabels: …Run Code Online (Sandbox Code Playgroud) 我有一个StatelessWidget使用 aScopedModel来存储其数据的。该小部件基本上呈现了复选框列表和一些用于保存复选框状态的按钮。
现在我想跟踪用户是否更改了任何复选框,即自显示小部件以来选中/取消选中它们。所以我添加了这样的内容:
class MyCheckboxScreen extends StatelessWidget{
bool _hasBeenModified = false;
void _itemCheckedChange(bool checked, MyModel model){
_hasBeenModified = true;
// Code to change the model here
}
void _onCloseButton(){
if( _hasBeenModified ){
// Show a warning that there are modifications that will not be be saved
}
}
void _onSaveButton(Context context, MyModel model){
model.save();
Navigator.of(context).pop();
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我的StatelessWidgetnow 包含它自己的状态。
该状态不用于更新 UI 和重绘任何内容,它仅用于在按下“关闭”按钮时检查任何复选框是否有修改。
StatelessWidgeta拥有这种内部状态安全吗?或者这可能是一个问题?例如,小部件是否会意外重新创建,并且内部状态丢失?
我发现文档对此不是很清楚,它只是说
对于可以动态更改的组合,例如由于具有内部时钟驱动状态或取决于某些系统状态,请考虑使用 StatefulWidget。
但这听起来似乎只适用于影响 UI 并需要重建小部件的状态。
我试图使用构造函数参数传递一个函数,但它向我显示了标题中提到的错误。
import 'package:flutter/material.dart';
class TaskTile extends StatefulWidget {
@override
_TaskTileState createState() => _TaskTileState();
}
class _TaskTileState extends State<TaskTile> {
bool isChecked = false;
@override
Widget build(BuildContext context) {
return ListTile(
title: Text(
'This is a task',
style: TextStyle(
decoration: isChecked ? TextDecoration.lineThrough : null,
),
),
trailing: TaskCheckbox(
checkboxState: isChecked,
toggleCheckboxState: (bool checkboxState) {
setState(() {
isChecked = checkboxState;
});
},
),
);
}
}
class TaskCheckbox extends StatelessWidget {
final bool checkboxState;
final Function toggleCheckboxState;
TaskCheckbox(
{required this.checkboxState, required …Run Code Online (Sandbox Code Playgroud) 在我的程序中,我有两个不同的 Blocsbloc1和bloc2. 我使用MultiBlocProvider并添加这两个块。现在我想BlocListener在BlocBuilder. MultiBlocProvider因为bloc1我想要BlocBuilderand因为bloc2我想要BlocListener。我怎样才能做到这一点?
Scaffold(
body: MultiBlocProvider(
providers: [
BlocProvider<GenerateFieldsBloc>(
create: (_) => bloc1,
),
BlocProvider<SubmitFieldBloc>(
create: (_) => bloc2,
),
],
child:() //here how can I use both BlocListener and BlocBuilder ???
),
);
Run Code Online (Sandbox Code Playgroud) 最近我发现我们可以使用以下任一方法访问提供者值
Consumer<Model>(build: (context, value, child){
return Widget(child: value.valueName),
},
)
Run Code Online (Sandbox Code Playgroud)
或者使用
context.watch<Model>().valueName
最佳实践是什么?
flutter ×13
flutter-state ×13
bloc ×4
dart ×4
flutter-bloc ×3
riverpod ×2
cubit ×1
provider ×1