我有一个设置屏幕,在其中设置一些值。设置这些值时,它将保存在共享首选项中,并且在我对网络api调用的请求中需要这些值作为参数。
现在,我可以在活动中使用侦听器共享首选项,然后进行api调用并获取新数据,但是我想将其与LiveData一起使用。
如何使用LiveData侦听共享首选项中的更改,然后使用新参数进行网络呼叫。
我有以下 android 测试类
@HiltAndroidTest
@UninstallModules(PreferencesModule::class, CacheModule::class)
class PlayerRepositoryTest {
private val fakeServer = FakeServer()
private lateinit var repository: PlayerRepository
private lateinit var api: GameApi
private lateinit var cache: Cache
@get: Rule
var hiltRule = HiltAndroidRule(this)
@get: Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
@Inject
lateinit var database: GameDatabase
@Inject
lateinit var retrofitBuilder: Retrofit.Builder
@Inject
lateinit var apiPlayerMapper: ApiPlayerDetailsMapper
@Inject
lateinit var apiPaginationMapper: ApiPaginationMapper
@BindValue
@JvmField
val preferences: Preferences = FakePreferences()
@Module
@InstallIn(SingletonComponent::class)
object TestCacheModule {
@Provides
fun provideRoomDatabase(): GameDatabase {
return Room.inMemoryDatabaseBuilder( …Run Code Online (Sandbox Code Playgroud) 我在 CustomSrollView 中使用以下 SliverToBoxAdapter:
SliverToBoxAdapter(
child: Stack(
children: <Widget>[
Container(
width: double.infinity,
height: 50,
decoration: BoxDecoration(color: pink),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 30),
child: ListView.builder(
padding: const EdgeInsets.all(0),
shrinkWrap: true,
itemBuilder: (context, index) {
return buildSongRow(songs[index]);
},
itemCount: songs.length,
),
)
],
))
Run Code Online (Sandbox Code Playgroud)
问题是列表不滚动,这很明显,因为它有框约束。我在这里使用 SliverToBoxAdapter,因为我必须将我的列表堆叠在列表顶部的某个 Container 上。如何让我的列表滚动?如果使用 SliverToBoxAdapter 无法完成,我还有其他选择吗?
在 flutter 中,我们有一个小部件DraggableScrollableSheet。现在我想要孩子在拖动时的当前位置或当前大小。目前无法获得该值。它在其 builder 方法中提供了一个 ScrollController ,但这是在列表滚动时而不是在拖动时使用的。那么还有另一种方法可以跟踪列表的当前拖动位置吗?
我尝试添加 NotificationListener ,但这只给了我 dragstartnofification 和 dragendnotification 而没有给 dragupdate :
DraggableScrollableSheet(
initialChildSize: .70,
minChildSize: .70,
builder:
(BuildContext context, ScrollController scrollcontroller) {
return NotificationListener(
onNotification: (notification) {
print("$notification");
},
child: Container(
child: ListView.builder(
controller: scrollcontroller,
itemCount: widget.songs.length,
itemBuilder: (BuildContext context, int index) {
return buildSongRow(widget.songs[index]);
}),
),
);
}),
Run Code Online (Sandbox Code Playgroud) 嗨,我正在尝试在flutter项目中使用intl包。包获取命令成功运行,但导入包时显示错误。
对于我的dart文件中的导入,我正在使用以下导入
import 'package:intl/intl.dart';
Run Code Online (Sandbox Code Playgroud)
我还使用flutter upgrade命令从终端升级了flutter。
我想在卡片小部件中显示网络图像。我希望图像具有卡片的宽度和一些固定的高度。下面是代码。
ListView.builder(
itemCount: events.length,
padding: const EdgeInsets.all(8.0),
itemBuilder: (BuildContext context, int index) {
return Card(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
FadeInImage.assetNetwork(
placeholder: placeholder,
image: events[index].image,
fit: BoxFit.fitWidth,
height: 300,
)
],
),
);
})
Run Code Online (Sandbox Code Playgroud)
当我给图像一个固定的高度时,它的行为很奇怪。图像在卡片内部居中,顶部和底部有一些填充。我希望图像与顶部对齐。
在一个Fragment,Kotlins合成导入提供的布局Anko是行不通的.我试图设置视图的可见性,但它说视图为空.我有以下代码.
class HistoryFragment : Fragment(), HistoryContract.view, LoaderManager.LoaderCallbacks<List<SongEntity>>{
private lateinit var mPresenter : HistoryContract.Presenter
private lateinit var adapter: HistoryAdapte
private val loaderId : Int = 101
override fun onLoadFinished(loader: Loader<List<SongEntity>>?, data: List<SongEntity>?) {
hideLoadingIndicator()
if (data == null) {
showErrorView()
} else {
//update the adapter
adapter.updateDataset(data)
}
}
override fun onLoaderReset(loader: Loader<List<SongEntity>>?) {
}
override fun onCreateLoader(id: Int, args: Bundle?): Loader<List<SongEntity>> {
showLoadingIndicator()
return object : AsyncTaskLoader<List<SongEntity>>(activity!!.baseContext){
override fun loadInBackground(): List<SongEntity>? {
return mPresenter.fetchSongs()
}
} …Run Code Online (Sandbox Code Playgroud) 我试图在 CustomScrollView 中添加 Sliverlist 的动态列表,但它似乎不起作用。该方法正确返回了条子列表,我通过调试验证了这一点。这是我想要实现的示例代码
CustomScrollView(
key: PageStorageKey<String>(myKey),
slivers: _getSlivers(model.data, context),
),
Run Code Online (Sandbox Code Playgroud)
这是 _getSlivers 方法:
List<Widget> _getSlivers(List myList, BuildContext context)
{
List<Widget> slivers = myList.map((key) => SliverList(
delegate: SliverChildBuilderDelegate(
(BuildContext context, int index) {
buildRow(index)
}
},
childCount: myList.length,
),
),
).toList();
return slivers;
}
}
Run Code Online (Sandbox Code Playgroud) 我在颤动中使用耀斑动画。我在flare 帐户上创建了自己的动画。 这是我的耀斑文件的链接
现在,当我在我的 flutter 应用程序中使用这个动画时,动画图标太小了。我正在使用如下的耀斑动画:
Container(
width: 50,
height: 50,
child: Center(
child: FlareActor(
"flare_animations/heart.flr",
animation: "go",
),
),
)
Run Code Online (Sandbox Code Playgroud)
我可以看到动画正在发生,但它太小了。增加容器的大小并为 FlareActor 尝试不同的 boxfit 也无济于事。
我希望列表视图以偏移量开始。我试图通过在 ListView 中使用以下代码来实现。
控制器:ScrollController(initialScrollOffset:30 * ITEM_HEIGHT),
最初在第一次加载时,列表以正确的偏移量加载。
当通过从父小部件调用 set state 再次构建列表时,列表会更新,但滚动偏移的行为很奇怪。
有两种情况:
是因为当我滚动时它会保留最后一个滚动位置并抵消我的计算吗?我认为这不应该发生,因为它是一个无状态小部件。
class DaysManager extends StatelessWidget {
final int daysBeforeFocusDate = 30;
final int totalDaysToInit = 61;
static final double ITEM_HEIGHT = 108.00;
ScrollController scrollController;
List<Day> days;
DaysManager({DateTime focusDate}) {
final DateTime startDate =
focusDate.subtract(Duration(days: daysBeforeFocusDate));
days = List.generate(totalDaysToInit, (int index) {
return Day(
date: startDate.add(
Duration(days: index),
),
);
});
scrollController = ScrollController(initialScrollOffset: 30 *ITEM_HEIGHT);
}
@override
Widget build(BuildContext context) {
return _buildScrollView();
}
ListView _buildScrollView() …Run Code Online (Sandbox Code Playgroud)