如何为上下文创建小部件?用于空值(小部件)的空检查运算符



我遇到了一个问题。Flutter调试器说;对空值使用的空校验运算符";,在framework.dart.中突出显示下面的代码

/// The configuration for this element.
///
/// Avoid overriding this field on [Element] subtypes to provide a more
/// specific widget type (i.e. [StatelessElement] and [StatelessWidget]).
/// Instead, cast at any callsites where the more specific type is required.
/// This avoids significant cast overhead on the getter which is accessed
/// throughout the framework internals during the build phase - and for which
/// the more specific type information is not used.
@override
Widget get widget => _widget!;

我发现以下代码中的上下文没有小部件,但我不知道如何创建上下文的小部件。

id: context.read<SignupCubit>().state.user!.uid,

我相信我下面的代码和github上发布的代码完全相同。https://github.com/maxonflutter/flutter_dating_app_series/blob/master/lib/screens/onboarding/widgets/custom_button.dart

• Flutter version 3.1.0-0.0.pre.1430 
• Dart version 2.18.0 (build 2.18.0-234.0.dev)
import 'package:datingapp/blocs/blocs.dart';
import 'package:datingapp/cubits/cubit/signup_cubit.dart';
import 'package:datingapp/model/models.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

class Custombutton extends StatelessWidget {
final TabController tabController;
final String text;
final void function;

const Custombutton(
{Key? key,
required this.tabController,
this.text = 'Start',
this.function})
: super(key: key);

// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return DecoratedBox(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5.0),
gradient: LinearGradient(colors: [
Theme.of(context).primaryColor,
Theme.of(context).secondaryHeaderColor
])),
child: ElevatedButton(
style:
ElevatedButton.styleFrom(elevation: 0, primary: Colors.transparent),
onPressed: () async {
if (tabController.index == 5) {
Navigator.pushNamed(context, '/');
} else {
tabController.animateTo(tabController.index + 1);
}
if (tabController.index == 2) {
await context.read<SignupCubit>().signupWithCredentials();
User user = User(
id: context.read<SignupCubit>().state.user!.uid,
name: '',
age: 0,
gender: '',
imageUrls: [],
interests: [],
bio: '',
jobTitle: '',
location: '',
matches: [],
swipeLeft: [],
swipeRight: [],
);
context.read<OnboardingBloc>().add(StartOnbording(user: user));
}
},
child: SizedBox(
width: double.infinity,
child: Center(
child: Text(
text,
style: Theme.of(context)
.textTheme
.headline4!
.copyWith(color: Colors.white),
),
),
),
),
);
}
}
import 'package:bloc/bloc.dart';
import 'package:flutter/cupertino.dart';
import 'package:equatable/equatable.dart';
import '../../repositories/auth/auth_repository.dart';
import 'package:firebase_auth/firebase_auth.dart' as auth;
part 'signup_state.dart';
class SignupCubit extends Cubit<SignupState> {
final AuthRepository _authRepository;
SignupCubit({required AuthRepository authRepository})
: _authRepository = authRepository,
super(SignupState.initial());
void emailChanged(String value) {
emit(state.copywith(email: value, status: SignupStatus.initial));
}
void passwordChanged(String value) {
emit(state.copywith(password: value, status: SignupStatus.initial));
}
Future<void> signupWithCredentials() async {
if (!state.isValid || state.status == SignupStatus.submitting) return;
emit(state.copywith(status: SignupStatus.submitting));
try {
var user = await _authRepository.signUp(
email: state.email, password: state.password);
emit(
state.copywith(
status: SignupStatus.success,
user: user,
),
);
} catch (_) {}
}
}
part of 'signup_cubit.dart';
enum SignupStatus { initial, submitting, success, error }
class SignupState extends Equatable {
final String email;
final String password;
final SignupStatus status;
final auth.User? user;
bool get isValid => email.isNotEmpty && password.isNotEmpty;
const SignupState(
{required this.email,
required this.password,
required this.status,
this.user});
factory SignupState.initial() {
return SignupState(
email: '', password: '', status: SignupStatus.initial, user: null);
}
@override
bool get stringify => true;
@override
List<Object?> get props => [email, password, status, user];
SignupState copywith({
String? email,
String? password,
SignupStatus? status,
auth.User? user,
}) {
return SignupState(
email: email ?? this.email,
password: password ?? this.password,
status: status ?? this.status,
user: user ?? this.user);
}
}

以下是我使用的飞镖包。

cupertino_icons: ^1.0.2
flutter_svg: ^1.0.3
equatable: ^2.0.3
flutter_bloc: ^8.0.1
step_progress_indicator: ^1.0.2
intl: ^0.17.0
firebase_core: ^1.17.0
firebase_auth: ^3.3.13
image_picker: ^0.8.5
firebase_storage: ^10.2.12
cloud_firestore: ^3.1.15

似乎在null变量中使用了null检查运算符(!)。可能是CCD_ 1。在调用它之前确保它不是null,或者如果它是null的话,只需更改null运算符来替换:

// If user is null, use '' (empty string) instead of null
id: context.read<SignupCubit>().state.user?.uid ?? ''

最新更新