我使用Hive Packages,我在我的项目中实现了模块化。首先,我network使用运行命令创建名称为包的包flutter create --template=package network,我引用了这个。
这个包包括我的项目模型。之后我创建模型用户,然后运行命令构建模型flutter packages pub run build_runner build --delete-conflicting-outputs:
import 'package:hive/hive.dart';
part 'user_model_hive.g.dart';
@HiveType()
class UserModelHive extends HiveObject {
@HiveField(0)
DateTime id;
@HiveField(1)
String giverName;
@HiveField(2)
String pinCodeNumber;
UserModelHive({this.id, this.giverName, this.pinCodeNumber});
}
Run Code Online (Sandbox Code Playgroud)
但我得到这样的错误
Could not find package "build_runner". Did you forget to add a dependency? pub finished with exit code 65
我确定已经包含build_runner在我的包中network。
pubspec.yaml
name: network
description: A new Flutter package project.
version: 0.0.1 …Run Code Online (Sandbox Code Playgroud) 我有 FutureBuilder 从 API 和代码中获取用户资料来获取用户,如下所示:
Future<List<UserModel>> getUserByUsername({@required String username}) async {
try {
final response =
await _client.get("$_baseUrl/getUserByUsername?username=$username");
final Map<String, dynamic> responseJson = json.decode(response.body);
if (responseJson["status"] == "ok") {
List userList = responseJson['data'];
final result = userList
.map<UserModel>((json) => UserModel.fromJson(json))
.toList();
return result;
} else {
throw CustomError(responseJson['message']);
}
} catch (e) {
return Future.error(e.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
如果您在上面的 GIF 中可以看到,My FutureBuilder 位于 BottomNavigationBar 内。每次我从 BottomNavigationBar 更改屏幕/页面并回到我的 FutureBuilder 总是刷新!
我如何才能将其修复为仅刷新一次?
class _HomeScreenState extends State<HomeScreen> {
@override
Widget build(BuildContext context) { …Run Code Online (Sandbox Code Playgroud) 我在处理错误 Exception DIO包时遇到问题,我尝试在HTTP包中使用以下代码:
Future<List<Mosque>> getMahasiswaById(String id) async{
try {
var apiRespon = await http.get('$baseURL/mahasiswa/get/id/$id');
if(apiRespon.statusCode == 200){
final apiResponJson = json.decode(apiRespon.body);
return (apiResponJson['data'] as List).map((p)=>Mosque.fromJson(p)).toList();
}else{
print(apiRespon.statusCode.toString());
throw Exception('Failed Load Data with status code ${apiRespon.statusCode}');
}
}on Exception catch (e) {
print(e);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我用DIO进行更改,即使我已经在处理此异常,我的应用程序也会突然崩溃并出现错误异常:
Future<List<Mosque>> getMahasiswaById(String id) async{
try {
var apiRespon = await dio.get('$baseURL/mahasiswa/get/id/$id');
if(apiRespon.statusCode == 200){
final apiResponJson = apiRespon.data;
return (apiResponJson['data'] as List).map((p)=>Mosque.fromJson(p)).toList();
}else{
print(apiRespon.statusCode.toString());
throw …Run Code Online (Sandbox Code Playgroud) 我遇到了一些问题,_showSnackbar我看到以下错误:
Exception has occurred.
NoSuchMethodError (NoSuchMethodError: The method 'showSnackBar'
was called on null.Receiver: null
Tried calling: showSnackBar(Instance of 'SnackBar'))
Run Code Online (Sandbox Code Playgroud)
但我敢肯定,我已经创建GlobalKey为ShowSnackbar:
final _scaffoldKey = GlobalKey<ScaffoldState>();
Run Code Online (Sandbox Code Playgroud)
这是我的功能shownackbar
void _showSnackBar(BuildContext context, String message, Color color) {
final snackBar = SnackBar(
duration: Duration(seconds: 1),
backgroundColor: color,
content: Text(message),
);
_scaffoldKey.currentState.showSnackBar(snackBar);
}
Run Code Online (Sandbox Code Playgroud)
这就是我调用showsnackbar的方式
upload != 0 ? _showSnackBar(context,"Success Upload",Colors.green) : _showSnackBar(context,"Success Upload",Colors.green);
Run Code Online (Sandbox Code Playgroud)
这是我认为的完整源代码
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:mosque/api/api_mosque.dart';
class UploadImage extends StatefulWidget {
@override
_UploadImageState createState() => _UploadImageState(); …Run Code Online (Sandbox Code Playgroud) 我的应用程序中有 CupertinoDatePicker 以使用以下代码选择日期和时间:
formatColumn(
widget: Consumer<MainCalendarProvider>(
builder: (_, mcProvider, __) => SizedBox(
height: sizes.height(context) / 3.5,
child: CupertinoDatePicker(
initialDateTime: result['dateRevision'],
minimumDate: result['dateRevision'],
use24hFormat: true,
onDateTimeChanged: (dateChange) {
mcProvider.setSelectedDateFromCupertinoDatePicker( dateChange, );},
),
),
),
title: 'Date Activity'),
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我在我的应用程序中添加了功能暗模式。在暗模式文本颜色 CupertinoDatePicker 仍然为黑色,我想将其更改为白色。在 CupertinoDatePicker 中,只有 backgroundcolor 属性。我已经尝试更改为红色、蓝色、绿色等,但文本仍为黑色。
我怎样才能改变这个?
谢谢。
我有像上面这样的设计,我的标签栏位于 BottomNavigationBar 内,我想将标签栏放在我的 BottomNavigationBar 菜单中。问题是,我不想有嵌套的脚手架,我不想使用,TabController因为我的选项卡是动态的,选项卡长度可以根据用户添加它而减少或增加。如果我TabController在内部使用并定义它initState,则选项卡无法增加/减少,因为在 initState 中仅定义一次值。
我怎样才能做到这一点 ?
我的期望与下面的示例类似,当我添加选项卡和 tabMenu 时,它会增加。但出现这个错误
The following assertion was thrown building TabBar(dirty, dependencies: [_InheritedTheme,
_LocalizationsScope-[GlobalKey#a56a4]], state: _TabBarState#fb337):
Controller's length property (2) does not match the number of tabs (3) present in TabBar's tabs
property.
The relevant error-causing widget was:
TabBar
Run Code Online (Sandbox Code Playgroud)
class TaskScreen extends StatefulWidget {
@override
_TaskScreenState createState() => _TaskScreenState();
}
class _TaskScreenState extends State<TaskScreen> with SingleTickerProviderStateMixin {
TabController _tabController;
final List<Tab> _tab = [
Tab(text: …Run Code Online (Sandbox Code Playgroud) 我使用Tween[Color]、NotificationListener[ScrollNotification]和 Appbar制作简单的动画来改变 Appbar 的颜色。我想在这种情况下滚动屏幕时更改颜色 Appbar 和操作图标:
if (notification.metrics.pixels == notification.metrics.minScrollExtent) {
Future.delayed(Duration(seconds: 0), () => controllerAppbar.reverse());
} else {
Future.delayed(Duration(seconds: 0), () => controllerAppbar.forward());
}
Run Code Online (Sandbox Code Playgroud)
当我滚动屏幕并达到两个条件时,我收到此错误,但我得到了我想要的结果。
???????? Exception caught by widgets library ???????????????????????????????????
Class 'Color' has no instance method '-'.
Receiver: Instance of 'Color'
Tried calling: -(Instance of 'Color')
The relevant error-causing widget was
AnimatedBuilder
Run Code Online (Sandbox Code Playgroud)
我怎么修?
class AppBarAnimationColor extends StatefulWidget {
final Duration duration; …Run Code Online (Sandbox Code Playgroud) 我正在使用 Hive 来制作简单的 CRUD;在Hive Doc about open box 中,我们可以这样声明:
var box = await Hive.openBox<E>('testBox');
Run Code Online (Sandbox Code Playgroud)
我的问题:是否可以制作多个 openBox?我想要这样的东西:
Future _openBox() async {
var dir = await getApplicationDocumentsDirectory();
Hive.init(dir.path);
var box_session = await Hive.openBox("box_session");
var box_comment = await Hive.openBox("box_comment");
return await box_session,box_comment;
}
Run Code Online (Sandbox Code Playgroud) 我想显示日历并包括事件,该事件已经存在于 API 中。我搜索适合我的情况的插件,我找到了Table Calendar Plugin。我阅读了示例以手动显示事件并找到它:
@override
void initState() {
super.initState();
final _selectedDay = DateTime.now();
_events = {
_selectedDay.subtract(Duration(days: 30)): ['Event A0', 'Event B0', 'Event C0'],
_selectedDay.subtract(Duration(days: 27)): ['Event A1'],
_selectedDay.subtract(Duration(days: 20)): ['Event A2', 'Event B2', 'Event C2', 'Event D2'],
_selectedDay.subtract(Duration(days: 16)): ['Event A3', 'Event B3'],
_selectedDay.subtract(Duration(days: 10)): ['Event A4', 'Event B4', 'Event C4'],
_selectedDay.subtract(Duration(days: 4)): ['Event A5', 'Event B5', 'Event C5'],
_selectedDay.subtract(Duration(days: 2)): ['Event A6', 'Event B6'],
_selectedDay: ['Event A7', 'Event B7', 'Event C7', 'Event D7'],
_selectedDay.add(Duration(days: 1)): …Run Code Online (Sandbox Code Playgroud) 我已经使用计时器和以下代码创建了运行时钟:
class LiveClock extends StatefulWidget {
@override
_LiveClockState createState() => _LiveClockState();
}
class _LiveClockState extends State<LiveClock> {
String _timeString;
String _dateString;
Timer _timerClock;
String _formatTime(DateTime dateTime) => DateFormat.Hms().format(dateTime);
String _formatDate(DateTime dateTime) =>
DateFormat.yMMMMEEEEd(appConfig.indonesiaLocale).format(dateTime);
@override
void initState() {
super.initState();
_timeString = _formatTime(DateTime.now());
_dateString = _formatDate(DateTime.now());
_timerClock = Timer.periodic(Duration(seconds: 1), _getTime);
}
@override
void dispose() {
_timerClock.cancel();
super.dispose();
}
void _getTime(Timer timer) {
final DateTime now = DateTime.now();
final String formattedTime = _formatTime(now);
setState(() => _timeString = formattedTime);
}
@override
Widget …Run Code Online (Sandbox Code Playgroud)